PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nachrichten-Schlange löschen


Matti
2003-06-16, 18:42:01
hab ein MFC-Dialogfeld-Projekt, und ich will nicht, daß es mit Escape beendet wird, weil Escape eine andere Funktion hat.
Also habe ich mir überlegt, daß ich die Nachrichten-Schlange löschen muß, was ich so gelöst habe:

LPMSG lpMsg;
while(PeekMessage(lpMsg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE));

aber leider hängt sich das Prog dann auf.

stabilo_boss13
2003-06-16, 20:50:47
Original geschrieben von Matti
hab ein MFC-Dialogfeld-Projekt, und ich will nicht, daß es mit Escape beendet wird, weil Escape eine andere Funktion hat.
Also habe ich mir überlegt, daß ich die Nachrichten-Schlange löschen muß, was ich so gelöst habe:

LPMSG lpMsg;
while(PeekMessage(lpMsg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE));

aber leider hängt sich das Prog dann auf.
Das muss so heissen:

while(PeekMessage(lpMsg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE|PM_NOYIELD));

If no windows for this task need to be updated, GetMessage and PeekMessage yield control at this point, unless PeekMessage was called with the PM_NOYIELD option. This yield is done to prevent applications with fast timers (checked next) from hogging all the CPU time. (Remember, we are dealing with a nonpreemptive multitasking system.)
Quelle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_getpeek.asp

Xmas
2003-06-17, 02:58:48
Original geschrieben von Matti
hab ein MFC-Dialogfeld-Projekt, und ich will nicht, daß es mit Escape beendet wird, weil Escape eine andere Funktion hat.
Also habe ich mir überlegt, daß ich die Nachrichten-Schlange löschen muß, was ich so gelöst habe:

LPMSG lpMsg;
while(PeekMessage(lpMsg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE));

aber leider hängt sich das Prog dann auf.
Hier (http://simplesamples.info/Keyboard/AcceleratingDialogs.asp) wird beschrieben wie du Accelerators nutzt um in MFC-Dialogen einer Taste eine spezielle Funktion (oder auch nichtstun) zuzuordnen.

Matti
2003-06-17, 10:31:41
@stabilo_boss
geht leider auch nicht. Also das Programm hängt sich nicht beim Leeren der Nachrichten-Schlange auf, sondern erst wenn die Funktion, in der die Schlange geleert wird, verlassen wird.


werd mir jetzt mal den Link von Xmas angucken...



EDIT:
Hab gerade eine andere Methode gefunden: man überschreibt CDialog :: OnCancel() durch eine eigene Funktion, in der das Fenster nicht geschlossen wird. Aber hier muß man aufpassen, weil man dann das Fenster auch nicht mit einem Click aufs X beenden kann. Man muß das Programm mit der Anweisung "EndDialog(0);" beenden.