Zunächst soll es hier darum gehen, auf Windowsmessages zuzugreifen die in der Form oder im aktuellen Steuerelement nicht auf der "Ereignis" -Seite des Objectinspetors zu finden sind.
Als Beispiel soll die Windowsmessage WM_MOVE abgefangen und ausgewertert werden.
Im ersten Schritt ist eine Botschaftszuordnungstabelle in der Headerdatei des Formulars zu erstellen. Diese sieht wie folgt aus:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // Von der IDE verwaltete Komponenten
TStringGrid *StringGrid1;
TButton *Button1;
private: // Benutzer-Deklarationen
public: // Benutzer-Deklarationen
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOVE, TMessage,OnMove)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Eine Botschaftszuordnungstabelle besteht aus:
Der in der Botschaftszuordnungstabelle befindliche MESSAGE_HANDLER besteht aus:
Im zweiten Schritt ist in der Headerdatei die eben erwähnte Funktion zu verankern
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // Von der IDE verwaltete Komponenten
TStringGrid *StringGrid1;
TButton *Button1;
private: // Benutzer-Deklarationen
void __fastcall OnMove(TMessage& Message);
public: // Benutzer-Deklarationen
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOVE, TMessage,OnMove)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Nunmehr sollte sich die Headerdatei bereits ohne Fehler compilieren lassen.
Im dritten Schritt muss in der *.cpp des Formulars die eben in der Headerdatei angelegte Funktion implementiert werden
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "iostream"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnMove(TMessage& Message)
{
}
//---------------------------------------------------------------------------
Das sind excat die Arbeiten, die die IDE macht, wenn man ein Doppelklick in der Ereignisseite auf ein Ereignis macht. Damit sind die Arbeiten auch schon abgeschlossen. Um zu testen, ob die Message auch kommt, wir eine Messagbox genutzt:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "iostream"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnMove(TMessage& Message)
{
Application->MessageBox("Message da","Test",MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
}
//---------------------------------------------------------------------------
Bei einigen Messages kann das problematisch werden, da Windos diese ziemlich oft versendet.
Nun muss nur noch die TMessagestruktur ausgewertet werden und Windows mitgeteilt werden, ob oder das wir die Message bearbeitet haben. Hierzu sollte man sich in der MSDN die akutellen Informationen über die Message (hier WM_MOVE) besorgen. Danach wir also der wParam nicht genutzt und er lParam enthält die neuen Daten der Position. Wichtig ist der Rückgabewert der Message. Dieser ist 0 wenn wir die Nachricht bearbeitet haben.
Um auf die Werte von lParam zugreifen zu können, gibt es Makros
int PosX = LOWORD(lParam); int PosY = HIWORD(lParam);
oder man nutzt die von der Struktur vorgegebenen Möglichkeiten
int PosX = Message.LParamLo; int PosY = Message.LParamHi;
Wenn wir irgendwas mit den Werten gemacht haben (das Fenster verschoben) teilen wir dem System mit, dass unsere Anwendung die Nachricht bearbeitet hat.
Message.Result=0;
Um ein Fenster also am Postion 0/0 festzuhalten ist folgender Code nötig
Left=0; Top=0; Message.Result=0;