Re: How to reorder MDI documents gracefully?
On Nov 21, 8:41 pm, Joseph M. Newcomer <newco...@flounder.com> wrote:
What do you mean by "reorder"? Z-axis positioning? That should be t=
rivial.
SetWindowPos should do the job.
joe
On Fri, 21 Nov 2008 18:07:01 -0800 (PST), Bruce L <Bruce.Lam...@gmail.com=
wrote:
Hi,
I have been grappling with this for a while and can't find any other
solutions out there yet. Hopefully some kind reader will know of some
better way to do this...
I have an image-viewer MDI app where each (derived) CDocument holds a
single (derived) CView (one view = 1 image). I have keystrokes defined
in CView::OnKeyDown so that the 'Page Up' & 'Page Down' keys cause the
next/previous image to be displayed. I also have a custom CListCtrl in
a pop-up dialog which displays the list of images currently open and
allows the order of the images in the list to be changed. However I
can't find a decent way to get this reorder to propagate back to the
actual displayed image windows. I managed to hack a way that works but
it's unacceptably slow. What I do is minimize all the open windows in
the old order, remove all the CDocuments from the CDocTemplate, then
restore them one at a time in the new order adding the CDocs back to
the CDocTemplate. As you can imagine, with say 20 images open and XPs
slick animation effects (!), this takes a good 5 seconds, when really
I would just like to shortcut to having the reordered CDocument jump
into it's new position.
My current reordering strategy code:
------------------------------------------------------------------------=
--------------------------------------
void CMainFrame::ReorderImages(CListCtrl* imgList) {
// change ordering of windows in an MDIFrameWnd by minimizing
// all windows, removing docs from cdt then restoring in the new
// desired order (add docs back to cdt in this order too)
CDocTemplate *cdt = theApp.pHDRTemplate; //GetNextDocTemplate(=
p);
POSITION p = cdt->GetFirstDocPosition();
std::vector<CDoc* > before;// = new CDoc*[GetDocCount()];
while (p) {
CDoc *cd = (CDoc *) cdt->GetNextDoc(p);
before.push_back(cd);
POSITION vp = cd->GetFirstViewPosition();
CView* v = (CView* )cd->GetNextView(vp);
v->GetParent()->ShowWindow(SW_SHOWMINIMIZED);
cdt->RemoveDocument(cd);
}
CString pathname, path2;
int pos;
for (int n = before.size()-1; n >= 0; n--) {
pathname = imgList->GetItemText(n, 1) + imgLis=
t->GetItemText(n, 0);
pos = 0;
while (pos < before.size()) {
path2 = before[pos]->GetPathNa=
me();
if (pathname == path2)
break;
pos++;
}
cdt->AddDocument(before[pos]);
POSITION vp = before[pos]->GetFirstViewPositio=
n();
CView* v = (CView* )before[pos]->GetNextView(v=
p);
v->GetParent()->ShowWindow(SW_RESTORE);
}
}
------------------------------------------------------------------------=
--------------------------
Does anyone know of a better way to do this?
Any help much appreciated...
Bruce
Joseph M. Newcomer [MVP]
email: newco...@flounder.com
Web:http://www.flounder.com
MVP Tips:http://www.flounder.com/mvp_tips.htm
Yes I did mean change Z-order, and it is indeed as trivial as calling
BringWindowToFront() on the reordered list of CWnds. That's why I
couldn't find any info on it - it's kind of like looking for
instructions on 'how to breath'...
Doh!
Thanks for the reply anyway,
Bruce