Die Nachrichtenfunktion


Zuständig für Nachrichten innerhalb unseres Programms ist eine eigene Funktion. Die meisten Programme verwenden den Namen "WndProc" für diese Funktion, der auch so in der Microsoft-Hilfe zu finden ist. Auch unser Beispielprogramm hat in der Zeile

wc: TWndClassEx = (
  ...
  lpfnWndProc     : @WndProc;
  ...
);

diese Funktion deklariert. Fensternachrichten ("Windows Messages") beginnen üblicherweise mit dem Präfix "WM_???". Der beste Weg, diese Nachrichten zu filtern und abzuarbeiten, dürfte eine case-Schleife sein. Nachrichten, für die wir keine besondere Aktion vorgesehen haben, übergeben wir an die allgemeine Nachrichtenfunktion von Windows. Das System kümmert sich dann darum. Der folgende Auszug aus dem Beispielprogramm zeigt Ihnen das Filtern der Nachricht "WM_CREATE", die beim Erzeugen unseres Fensters aufgerufen wird:

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;   //Variablen für Fensterposition
begin
  Result := 0;
case uMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); //Screenhöhe & -breite y := GetSystemMetrics(SM_CYSCREEN); {Fenster auf neue Position verschieben} MoveWindow(hWnd, (x div 2) - (WindowWidth div 2), (y div 2) - (WindowHeight div 2), WindowWidth, WindowHeight, true); end; else Result := DefWindowProc(hWnd,uMsg,wParam,lParam); end; end;


Ein Wort zu "WM_DESTROY":

Diese Nachricht wird gesendet, wenn das Fenster im wahrsten Sinn des Wortes zerstört wird. In diesem Fall müssen wir mit "PostQuitMessage(0);" antworten und so die Nachricht "WM_QUIT" erzeugen, die die Nachrichtenschleife beendet. In der Hilfe heißt es dazu (frei übersetzt):

 Platform SDK 

Die Nachricht WM_QUIT bezeichnet die Aufforderung, eine Anwendung zu beenden und wird erzeugt, wenn die Anwendung die Funktion "PostQuitMessage" aufruft. Als Ergebnis liefert die Funktion "GetMessage" den Wert Null zurück.

Was würde passieren, wenn wir den Aufruf von "PostQuitMessage(0)" entfernen würden? Zwar würde das Fenster verschwinden, aber wenn Sie das Programm aus Delphi heraus starten, dann würde der Debugger immer noch laufen. Mit anderen Worten: das Programm läuft weiter und kommt aus der Nachrichtenschleife nicht mehr heraus. Beenden lässt es sich dann nur über den Taskmanager, bzw. (in der Delphi-IDE) durch ein erneutes Kompilieren.