Eine Frage, auf die es scheinbar keine Antwort gibt...
-
Du drückst den Button um das ganze zu starten
Du startest einen Dialog.
In der Funktion OnInitialise() (hier wird der Dialog noch nicht angezeigt) startest du einen eigenen Dialog der dir den Status ausgibt. Bsp.:CStartDlg sdlg; //Im StartDlg wird der Ladefortschritt angezeigt sdlg->Create(IDD_DIALOG1,NULL); sdlg->ShowWindow(SW_SHOW); //Diese Funktion wird aufgerufen um den Ladefortschritt im StartDlg zu aktualisieren sdlg->SetPos(..);//Weitersetzen der Statusanzeige in dem Dialog sdlg->DestroyWindow();Die Funktion ist zu Ende, der Status-Dialog verschwindet, der eigendliche Dialog wird gezeichnet (nach der Funktion OnInitalise()), Der User Gibt Password und Username ein, drückt auf START(oder weiter), ....->weiter wie du glaubst.
TSCHAU, SIGI
-
Fast feder Dialog hat ein OnInitDialog.
Darum nennt man es ja OnInitDialog weil beim "initialisieren des Dlg ausgeführt"
Solltest du diese Funktion nicht in deinem Dlg haben dann musst du sie von Assi erstellen lassen.
Auf die DlgKlasse klicken (rechte Maustaste)
Im Menü "Behandlungsroutine für Windowsnachrichten hinzufügen" und einfach ein doppelklicj auf die Nachricht "WM_INITDIALOG"
-
Hallo,
der Ansatz scheint mir richtig, jedoch passiert folgendes wenn ich eine MessageBox in OnShow(), OnCreate(), OnInitDialog() oder OnDoModal() reinschreibe:
-> man drückt den Button -> es kommt die MessageBox -> Fenster wird dargestellt.
Dummerweise genau falsch rum.

(Was ich bräuchte: ->Button->Fenster wird dargestellt->Nachricht/Oder mein Code eben ausgeführt)Aber trotzdem Danke

mfg
trequ
-
Starte in OnInitDialog() einen Timer,und rufe die MessageBox in OnTimer() auf.
-
Hallo,
erst mal RIESEN DANK - es scheint zu funktionieren.
Habe folgendes eingebunden:
BOOL CConnect_to_Server::OnInitDialog() { MessageBox("init"); SetTimer(1, 1000, NULL); CDialog::OnInitDialog(); return TRUE; } void CConnect_to_Server::OnTimer(UINT nIDEvent) { MessageBox("Nachricht"); KillTimer(nIDEvent); CDialog::OnTimer(nIDEvent); }Da der Dialog jedoch gleich gezeichnet ist, sollte es doch reichen, nur SetTimer(1, 10, NULL); zu schreiben - also 10ms, oder vieleicht 100.
Wenn ich das jedoch mache, lässt sich der Timer nicht mehr beenden, und ich werden von den MessageBoxen "überflutet".
Mache ich was falsch, oder ist einfach 1000ms das Minimum?Danke.
mfg
trequ
-
#define IDT_TIMER1 1 //Am besten über Menü->Ansicht->Ressourcensymbole ------------------------------------ SetTimer(IDT_TIMER1, 20, NULL); ------------------------------------- void CConnect_to_Server::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case IDT_TIMER1: MessageBox("Nachricht"); KillTimer(nIDEvent); //besser KillTimer(IDT_TIMER1); break; default: break; } CDialog::OnTimer(nIDEvent); }Ich hab mal gelesen das 20ms die kleinste Zeit ist die er verarbeiten kann.
Du kannst aber auch 0 oder 1 schreiben, das macht der Funktion nichts.Diese Funktion hat nur einen Hacken, Sie wird nur dann ausgeführt wenn der Prozessor nicht zu sehr ausgelastet ist (wird bei dir nicht der Fall sein), ansonsten wird die Ausführung auf später verschoben.
-
Hallo,
funktioniert seltsamer weise nicht. Habe da jetzt noch eine MSG Box reingeschrieben und einen 2. Kill:
BOOL CConnect_to_Server::OnInitDialog() { MessageBox("init"); SetTimer(IDT_TIMER1, 5000, NULL); MessageBox("wieder da"); CDialog::OnInitDialog(); return TRUE; } void CConnect_to_Server::OnTimer(UINT nIDEvent) { MessageBox("Nachricht"); KillTimer(IDT_TIMER1); KillTimer(nIDEvent); CDialog::OnTimer(nIDEvent); }Selbst wenn ich die Zeit auf 5 Sek. stelle, kommt nach 5 Sek. noch eine Dialogbox mit "Nachricht".
Ich kriege im Moment "init" dann nach Ok "wieder da" und dann alle 5 Sek - auch ohne OK bei "wieder da" das Fenster "Nachricht"
Irgendwie läuft der Timer zwar richtig, aber er beendet sich nicht.
mfg
trequ
-
mach den von mir vorher vorgeschlagenen switch-Block, denn vielleicht läft der Timer durch irgend einen anderen Aufruf. Oder mach eine if-Abfrage.
if(nIDEvent == IDT_TIMER1) { KillTimer(IDT_TIMER1); } CDialog::OnTimer(nIDEvent);
-
Hallo,
Habe das jetzt probiert:
BOOL CConnect_to_Server::OnInitDialog() { MessageBox("init"); SetTimer(IDT_TIMER1, 1000, NULL); CDialog::OnInitDialog(); return TRUE; } void CConnect_to_Server::OnTimer(UINT nIDEvent) { if(IDT_TIMER1 == nIDEvent) { MessageBox("Nachricht"); KillTimer(IDT_TIMER1); KillTimer(nIDEvent); } else { MessageBox("andere Nachricht"); } CDialog::OnTimer(nIDEvent); }selber Fehler.
Bin jetzt dahinter gekommen:
schreibe ich:
....
MessageBox(...);
KillTimer(...);
...
geht es nicht.
...
KillTimer(...);
MessageBox(...);
...
Dagegen geht aber.
Ich muss das jetzt nicht verstehen oder?
Der Timer wird irgendwie durch KillTimer nicht beendet, wenn ein Code davor steht, auch wenn es keine MessageBox ist.

mfg
trequ
-
Ich denke das in der Zeit die du benötigst um die MessageBox wegzuklicken sich einige Aufrufe von OnTimer ansammeln.