Nicht-modale Dialoge


Mit der Funktion CreateDialog erzeugen Sie einen nicht-modalen Dialog. Neben der Anwendungsinstanz übergeben Sie die ID der Dialog-Ressource, das Besitzerfenster (hier Null) und einen Zeiger auf die Nachrichtenfunktion. Wenn wir bei unserem Skriptbeispiel bleiben, dann würde der Aufruf so aussehen:

hDialog := CreateDialog(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc);

Laut MSDN nutzt diese Funktion aber auch nur CreateDialogParam, die Sie also stattdessen aufrufen könnten. Neu ist hier nur der Initialisierungswert, den Sie nicht zwangsläufig verwenden müssen. Sie können hier aber einen Wert für lParam angeben, der dann an Ihre Dialog-Nachrichtenfunktion weitergegeben wird:

hDialog := CreateDialogParam(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc, 0);

Wenn Sie eine dieser Funktionen benutzen, dann benötigen Sie auch eine Nachrichtenschleife, in der Sie ankommende Nachrichten abfangen. Allerdings unterscheidet sich die Dialog-Nachrichtenschleife durch den Aufruf der Funktion IsDialogMessage. Weil diese Funktion das Übersetzen und Verteilen der Nachrichten selbst ausführt, darf sie nicht von "TranslateMessage" oder "DispatchMessage" bearbeitet werden.

while GetMessage(msg,0,0,0) do
begin
  IsDialogMessage(hDialog,msg);
end;
Hinweis

Wenn Sie in Ihrem Programm die Nachrichten "WM_USER" und "WM_USER + 1" benutzen, könnten u.U. Probleme auftreten, weil "IsDialogMessage" in einigen Fällen die Nachrichten "DM_GETDEFID" und "DM_SETDEFID" senden kann. Diese besitzen die selben numerischen Werte wie die o.g. Nachrichten, so dass es zu Überschneidungen und damit verbundenen Problemen kommt, wenn Ihr Programm z.B. eine Bearbeitung von "WM_USER + 1" vorsieht.

Wenn Sie sich für diese Form des Dialogaufrufs entscheiden, müssen Sie sich im Klaren sein, dass Sie die Verantwortung für die Verarbeitung aller Nachrichten haben. Das betrifft alle Controls, die Sie auf dem Dialog platziert haben usw. Oder wenn Sie z.B. Shortcuts aus den Ressourcen laden und bearbeiten wollen, dann bleibt Ihnen leider nichts anderes übrig, als diesen Weg zu wählen.


Nach dem Verlassen der Nachrichtenschleife sollten Sie auch das Dialog-Handle mit der Funktion "DestroyWindow" freigeben:

DestroyWindow(hDialog);