Die Nachrichtenfunktion für Dialoge


Unsere Dialoge benötigen eine Funktion, in der wir auf ankommende Nachrichten reagieren können. Das Prinzip entspricht also der herkömmlichen "WndProc"-Funktion bei Fenstern, unterscheidet sich aber im Bool-Rückgabewert. Unter dem Stichwort DialogProc werden Sie im PSDK fündig. Wenn die Funktion als Ergebnis false zurückliefert, ist das quasi das Zeichen, dass der Standard-Handler stattdessen aktiv werden soll. Wenn Sie selbst Nachrichten bearbeiten, dann sollten Sie unbedingt true zurückgeben, um die Abarbeitung durch den Standard-Handler zu vermeiden.

function dlgfunc(hDlg: hWnd; uMsg: dword; wParam: wParam; lParam: lParam): bool;
  stdcall;

Und noch einen Unterschied gibt es: Auf die Nachricht "WM_CREATE" werden Sie vergeblich warten. Das Gegenstück heißt hier "WM_INITDIALOG".

Beim Beenden des Dialogs kommt es nun darauf an, für welche Funktion Sie sich entschieden haben. Nutzen Sie "CreateDialog", dann müssen Sie den Dialog (wie bei der herkömmlichen Fensterfunktion) mit "PostQuitMessage(0)" beenden um die Nachrichtenschleife verlassen zu können:

WM_CLOSE:
  PostQuitMessage(0);

Nutzen Sie stattdessen "DialogBox", genügt der Aufruf des schon erwähnten Befehls "EndDialog":

WM_CLOSE:
  EndDialog(hDlg,0);

Im Beispielprogramm finden Sie beide Varianten.


Den Dialog mit ESC beenden

Ihnen ist sicher bekannt, dass sich die meisten Dialogboxen mit der ESC-Taste einfach schließen lassen. Diese Funktionalität fehlt bisher noch, lässt sich aber recht einfach nachrüsten. Wenn Sie auf ESC drücken, sendet das System die Nachricht "WM_COMMAND". Der wParam enthält dann den Wert IDCANCEL, so dass Sie nur wie folgt reagieren müssen:

WM_COMMAND:
  if(wParam = IDCANCEL) then SendMessage(hDlg,WM_CLOSE,0,0)
    else { ... }

Mehr ist nicht erforderlich.