Der Datenbankheini im Message-Dschungel
Ich habe vor kurzem schonmal meine Fähigkeit zur totalen Verwirrung hier dargestellt.
@Lucky vorab: Ich habe Deine Tutorials gelesen, aber noch nicht wirklich durchgeholt. Besonders verwirrt mich, aus der reinen VCL-Ecke kommend, die Vermischung von API und VCL. Das wird wohl noch ein Weilchen dauern bis es vergeht.
Also hätte ich da so eine Komponente, die an eine andere vom Typ TWinControl gekoppelt ist. Um das Aussehen der Beiden beeinflussen zu können und in den Zeichenprozess eingreifen zu können, habe ich mir den Typ
TLsWndProc = procedure(var Message: TMessage) of object;
gebastelt und die Komponente hat u.a. diese Variablen und Prozeduren:
Delphi-Quellcode:
FOriginalWndProc : TLsWndProc;
procedure SetControl(Value: TWincontrol);
procedure MyWndProc(Var Message : TMessage);
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
wenn ich sie an diese ankoppel, rufe ich SetControl auf, merke mir dort die WindowProc des TWincontrol und biege sie anschließend auf meine Procedur um:
Delphi-Quellcode:
FOriginalWndProc := TWincontrol(FControl).WindowProc
TWincontrol(FControl).WindowProc := MyWndProc;
so weit, so schön. Ich dachte mir MyWndProc für die (Draw-relevanten)Nachrichten des gekaperten TWincontrols und WMPaint für meine eigenen Malereien.
Als mir nun einfiel, es wäre schön, auf den Erhalt des Focus durch meine gekaperte TWincontrol zu reagieren, wollte ich mich auf gleiche Weise der Ereignisse OnEnter und On Exit bemächtigen. Nun stellte ich fest, dass die in TWinControl noch nicht public sind, wühlte ein wenig im
VCL-Code und fing an zu grübeln:
1. kommen diese Nachrichten (OnEnter/OnExit bzw. CM_ENTER/CM_EXIT) nicht schon in der WindowProc des gekaperten TWinControl an? Kann ich schon dort darauf reagieren (z.B.Einblenden meiner Komponente)?
2. Liege ich mit der Trennung WMPaint/WindowProc richtig, oder kommen in MyWndProc Aufgrund der Deklaration auch meine eigenen Ereignisse vorbeigehuscht?
3. Gibt meine Konfusion diesbezüglich Anlass her, ein Tutorial über
VCL/
API oder
API-Light zu basteln? Wenn ja, würde ich gern bei dessen Aufbau helfen.