Nicht modaler Dialog. Keine Steuerelemente
-
Hey Leute,
ich habe einen nicht modalen Dialog gebastelt. Der erscheint auch wunderbar. Allerdings werden die Steuerelemente usw des Dialoges erst angezeigt, wenn der Rechner nicht mehr arbeitet. Allerdings sollen diese schon früher angezeigt werden, weil der Dialog praktisch als Initialisierungs bzw. Wait-Dialog gedacht ist. Es bringt mir aber nix, wenn während der Initialisierung ein leerer Dialog angezeigt wird...
Was kann ich nun also tun, damit die Steuerelemente auch während des Initialisierens angezeigt werden und nicht erst, wenn er fertig ist?
Folgenden Code habe ich bisher:
CWaitDlg* wdlg = new CWaitDlg(); wdlg->Create(IDD_DIALOG6, NULL); wdlg->ShowWindow(SW_SHOW); // lalala fröhliche Initialisierung des Programms wdlg->DestroyWindow();während der Initialisierung bekomm ich jetzt halt ein Dialog ganz ohne Steuerelemente. Und ich hätt da zumindest gerne ne Statusleiste. Wenn ich jetzt aber während der Initialisierung ne MessageBox oder sowas einbaue, dann bekomm ich die Steuerelemente zu sehen. Ist diese weg, sehe ich sie nie. Was kann ich tun.
Vielen Dank im voraus.
Greez Osiris
-
Wie sieht denn Deine Message-Pump aus?
Ich bin mir jetzt nicht sicher, aber musste man nicht "PreTranslateMessage" überladen...BOOL PreTranslateMessage( msg ) { if( IsDialogMessage( msg ) ) return TRUE; else return CWnd::PreTranslateMessage( msg ); }
-
Was ist denn eine Message-Pump???
Und wenn ich PreTranslateMessage versuche zu überladen krieg ich Compiler Error, die aber wohl mit der falschen Deklaration von msg zu tun haben. Allerdings weiß ich nicht was für ein Objekt msg ist, sonst hätte ich es deklariert ( Also ich mein jetzt im Funktionskopf).
Greez Osiris
-
Wenn es nur darum geht diese Dialog anzuzeigen als Wartedialog, dann kannst Du einfach ein RedrawWindow durchführen. Alerdings benötigst Du in jedem Fall eine Nachrichtenschleife wie Jochen es schrieb wenn dieser Dialog regelmässig neu angezeigt werden soll, oder auch andere Programme diesen Dialog verdecken und wieder in den Vordergrund bringen.
Ectl. könntest Du auch daran denken, Deinen Vorgang, der so lange dauert in einen eigenen Thread auszulagern.
-
Hallo,
versuche das hier :Osiris1986 schrieb:
CWaitDlg* wdlg = new CWaitDlg(); wdlg->Create(IDD_DIALOG6, NULL); wdlg->ShowWindow(SW_SHOW); // dies hier einfügen, vielleicht hilfts.. MSG Message; while(::PeekMessage(&Message, NULL, NULL, NULL, PM_REMOVE)) { ::TranslateMessage(&Message); ::DispatchMessage(&Message); } // lalala fröhliche Initialisierung des Programms wdlg->DestroyWindow();Grüsse
pixel
-
Mal als ansatz für dich. auch in nichtmodaler dialog erzeugt keinen eingene thread.
warum es da probleme gibt steht auch in kürzlichen postings von anderen hier.
-
pixel schrieb:
Hallo,
versuche das hier :
<snip>Dies macht ein Programm reentrant. In diesem Fall müsstes Du das Main Window disabled, sonst könnte man wieder ein Menü öffnen, oder einen Accelerator benutzen etc.
-
Ich habs jetzt mal so probiert wie pixel das demonstriert hat und das ist genau das, was ich mir vorgestellt hatte. Die Idee mit dem Thread war aber auch nicht schlecht. Nur bin ich darauf nicht gekommen. Außerdem hab ich noch nie mit Threads gearbeitet. Deshalb lass ich es erstmal so wie es jetzt funktioniert. Vielen dank an alle
Greez Osiris
-
Der Vorschlag von pixel ist nicht schlecht, aber eigentlich nur für Win32. Besser ist Du benutzt folgendes:
MSG msg; while( ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE ) ) ::AfxGetThread()->PumpMessage();macht das gleiche, aber unterstützt die spezialitäten der MFC. Etwas umgestellt lässt sich daraus eine schöne Sleep für Threads basteln
.siehe auch http://www.mpdvc.de/html.htm#Q75
Gruß