2009-12-04 24 views
5

Ich muss ein Dialogfeld öffnen, das aus derselben Klasse zweimal instanziiert wird. Wenn ich dies versucheModalen Dialog in MFC erneut öffnen

Der zweite Aufruf öffnet den Dialog nur für einen Bruchteil einer Sekunde, dann ist es geschlossen. Meine Wette war es ein Überbleibsel Nachricht in der Nachrichten-Warteschlange, so fügte ich dies zwischen den Anrufen

MSG msgCur; 
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE)) 
    ; 

Dies löst das Problem, aber es fühlt sich an wie eine falsche Art der Sache zu tun. Gibt es eine Möglichkeit, die übrig gebliebene Nachricht ordnungsgemäß zu verarbeiten?

+0

Das sieht sehr seltsam aus, was genau versuchen Sie zu erreichen? –

+0

Ich muss meine Anwendung ohne Benutzeroberfläche laufen lassen und diesen Dialog jedes Mal öffnen, wenn ein Timer abgelaufen ist. – MMx

+0

Wie schließen Sie den Dialog? –

Antwort

1

Nicht EndDialog (IDOK) aufrufen;

Um die ok oder Abbrechen Tasten gedrückt zu halten erben nur OnOk oder OnCancel ... Sonst wird EndDialog zweimal aufgerufen werden und Sie werden das Problem bekommen, das Sie bekommen!

0

Wenn Sie möchten, dass Ihre Anwendung im Hintergrund ohne Benutzeroberfläche ausgeführt wird, warum nicht juz vorübergehend ausblenden? eine einfache Funktion this-> ShowWindow (SW_HIDE) wird die Arbeit für Sie erledigen.

Ich denke, Sie sollten Ihre Designentscheidung überarbeiten, da es für eine Anwendung unlogisch erscheint, sich so zu verhalten, wie Sie es haben wollten.

1

Ich denke eigentlich, dass YenFei hier einen guten Punkt hat.

Es ist eine Weile her, seit ich mit MFC gespielt habe (Gott sei Dank), aber aus dem Speicher kann ein Timer vom UI-Thread aufgerufen werden oder nicht, je nachdem, welchen Sie verwenden. Wenn der Zeitgeber im Hauptthread der Benutzeroberfläche ausgelöst wird, hält ein modales Dialogfeld den Hauptthread wahrscheinlich an, bis er beendet wird. Anschließend wird er vom nächsten Zeitgeber aufgerufen. Wenn der Timer in einem separaten Thread ausgelöst wird, blockiert Ihr Dialogfeld den Hauptbenutzeroberflächen-Thread nicht, da er in einem separaten Thread angezeigt wird.

Es scheint eher vorstellbar, da YeenFei darauf hingewiesen hat, dass Sie Ihren Dialog jedes Mal erneut anzeigen möchten, wenn der Timer ausgelöst wird, und ihn ausblenden, wenn der Benutzer auf die Schaltfläche klickt, um ihn zu schließen. Wenn die Zeit erneut erhöht wird, wird der Dialog nur dann erneut angezeigt, wenn er gerade geöffnet ist oder nicht.

Es gibt eine große Post here (www.eggheadcafe.com) über Timer und Nebenläufigkeit, die Sie interessant finden können, und kann Dinge klarer als was ich geschafft habe zu erreichen.

1

Warum können Sie es so nicht-Code:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
0

Ich löste das Problem, indem sie den Dialog versteckt, anstatt sie zu schließen und einen anderen Thread startete den ersten schläft und dann den Dialog blendet.

0

Code Linie sein:

m_pMainWnd = &dlg; 

Wenn ja, als Anwendung nach dem ersten Aufruf von DoModal() wird abgeschlossen, alle anderen Aufruf von DoModal() gibt -1. Von MSDN:

Die Microsoft Foundation Class Library beendet automatisch den Thread, wenn das Fenster, auf das sich m_pMainWnd bezieht, geschlossen wird. Wenn dieser Thread der primäre Thread für eine Anwendung ist, wird die Anwendung ebenfalls beendet.

Verwandte Themen