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
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.
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.