Modalen Dialog sofort anzeigen
-
Hallo,
CDialog::DoModal() wartet vor dem Anzeigen eines Dialogs, bis die Message-Queue leer ist. Da in meinem Programm über Timer ständig diverse Aktivitäten angestoßen werden, kann es daher manchmal sehr lange dauern, bis ein modaler Dialog tatsächlich erscheint.
Daher habe ich DoModal() wie folgt geändert:... if (CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(hWndParent), hInst)) { if (m_nFlags & WF_CONTINUEMODAL) { //Added: ShowWindow(SW_SHOWNORMAL); UpdateWindow(); //End Added // enter modal loop DWORD dwFlags = MLF_SHOWONIDLE; if (GetStyle() & DS_NOIDLEMSG) dwFlags |= MLF_NOIDLEMSG; VERIFY(RunModalLoop(dwFlags) == m_nModalResult); } // hide the window before enabling the parent, etc. if (m_hWnd != NULL) SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW| SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER); }
Klappt soweit gut.
Allerdings frage ich mich, welchen tieferen Sinn es hat, dass CDialog::DoModal() mit dem Aufblenden wartet und ob durch die Änderung unangenehme Nebeneffekte entstehen können.
Weiß jemand dazu näheres?Gruß und Danke,
Joachim
-
Wenn man ein Dialogfenster anzeigt, dann hat das Mainframe erst mal Pause, da dort die Nachrichtenwarteschlange auf das Return von DoModal wartet. Da der Dialog sicher die gleiche Priorität hat wie das Hauptprogramm wird der Aufruf ganz normal in die Queue eingereiht und abgearbeitet wenn er dran ist.
Ist aber nur so eine Idee...
-
Das ist totaler Quatsch. Du kannst einfach Deinem Dialog-Template den Stl WS_VISIBLE geben und der Dialog erscheint sofort!
Gleiches kann man erreichen indem man einfach in OnInitDialog ShowWindow aufruft.
Der tiefere Sinn ist jegliches Flackern zu verhindern wenn 1000 Controls initailisiert gesubclassed und gefüllt werden sowie das Flackern des enablend und disblen der Controls.
Welchen Sinn sollte esmachen den Dialog gleich anzuzeigen, außer um einen evtl. Fortschritt anzuzeigen und den mit RedrawWindow/UpdateWindoe zu forcieren?
-
Wie gesagt zeigt DoModal() den Dialog standardmäßig erst dann an, wenn die Message-Queue leer ist - und im gegebenen Fall kann es sein, dass sie aufgrund diverser Timer und dadurch ausgelöster Aktionen lange Zeit eben nicht leer wird. Dann hängt die Applikation.
Aber Danke für den Hinweis auf das Vermeiden von Flackern.
Gruß,
Joachim
-
wolffram schrieb:
Wie gesagt zeigt DoModal() den Dialog standardmäßig erst dann an, wenn die Message-Queue leer ist - und im gegebenen Fall kann es sein, dass sie aufgrund diverser Timer und dadurch ausgelöster Aktionen lange Zeit eben nicht leer wird. Dann hängt die Applikation.
Das ist unmöglich. Egal welche Timereinstellung man setzt, es kan nnicht sein, das PekkMessage nicht irgendwann sagt, keine Nachricht mehr vorhanden...
Mit Timern kann man eine Anwednung in diesem Sinne nie blockieren!Und egal was Du sagtst. Grundsätzlich wird ein Template sofort angezeigt, wenn das Template den Stil WS_VISIBLE hat!