This page in English.

C++ (VCL) Die WindowProc umleiten und Nachrichten selbst behandeln

Worum geht's hier?

In diesem Text geht es um die Umleitung der WindowProc-Funktion (im nachfolgenden Text auch WndProc genannt) eines Formulars (TForm) und einer TCheckListBox als Beispiel der Nachrichtenverarbeitung in einer C++ (VCL) Applikation.
Diese Methode stellt eine Alternative zur MESSAGE_MAP-Methode dar, mit der ebenfalls Nachrichten behandelt werden können. Ich persönlich bevorzuge allerdings die Umleitung.

WndProc von TForm

Die eigene Nachrichtenbehandlung von TForm könnte kaum einfacher sein:


void __fastcall TFormular::WndProc(TMessage &Message)
{
if (Message.Msg == WM_QUERYENDSESSION)
    {
    //Code
    Message.Result = true;
    return;
    }

TForm::WndProc(Message);
}

Die Funktion wird einfach überschrieben (Deklaration im Header nicht vergessen!).
Wenn die Nachricht WM_ENDQUERYSESSION empfangen wird, wird bestimmter Code ausgeführt, die Nachricht als Beantwortet markiert (Result = true) und dann die Funktion beendet. Wird die Funktion an dieser Stelle nicht mit return beendet, würde die Nachricht weitergegeben werden, an die reguläre WndProc von TForm.
Auf diese Art kann man die Nachrichten vorverarbeiten, nur darauf reagieren (und dann weiterleiten) oder auch selbst die ganze Arbeit machen. Man hat die volle Kontrolle über die Nachricht.

WndProc von TCheckListBox (oder anderen Komponenten)

Die Nachrichtenbehandlung von Komponenten ist kaum komplizierter:


Im Header:
private:
TWndMethod Old_CLB_WindowProc; //Alte Adresse der CheckListBox-WndProc
void __fastcall CLB_WindowProc(TMessage&); //Die eigene CheckListBox-WndProc (hierhin wird später umgeleitet)

In der Implementation:
void __fastcall TFormular::FormCreate(TObject *Sender)
{
Old_CLB_WindowProc = CLB->WindowProc; //Alte Adresse der CheckListBox-WndProc merken
CLB->WindowProc    = CLB_WindowProc;//Adresse mit der, der eigenen WndProc überschreiben
}

void __fastcall TFormular::CLB_WindowProc(TMessage &Message)
{
if (Message.Msg == WM_MBUTTONDOWN)
    {
    CLB_Changed();
    CLB->Repaint();
    }
Old_CLB_WindowProc(Message);
}

In diesem Beispiel wird auf die Nachricht WM_MBUTTONDOWN lediglich reagiert, danach wird sie zurück an die reguläre WndProc von der Komponente CLB gegeben. Natürlich ist dieselbe, volle Kontrolle über die Nachricht wie bei dem Überschreiben der WndProc von TForm möglich.

Last modified / Zuletzt geändert: 28 August 2008 (CEST) · Christian Lafin ·