How to reorder MDI documents gracefully?
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) + imgList->GetItemText(n, 0);
pos = 0;
while (pos < before.size()) {
path2 = before[pos]->GetPathName();
if (pathname == path2)
break;
pos++;
}
cdt->AddDocument(before[pos]);
POSITION vp = before[pos]->GetFirstViewPosition();
CView* v = (CView* )before[pos]->GetNextView(vp);
v->GetParent()->ShowWindow(SW_RESTORE);
}
}
--------------------------------------------------------------------------------------------------
Does anyone know of a better way to do this?
Any help much appreciated...
Bruce