![]() |
WindowProc, WMPaint ist das doppelt gemoppelt?
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
Delphi-Quellcode:
gebastelt und die Komponente hat u.a. diese Variablen und Prozeduren:
TLsWndProc = procedure(var Message: TMessage) of object;
Delphi-Quellcode:
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:
FOriginalWndProc : TLsWndProc;
procedure SetControl(Value: TWincontrol); procedure MyWndProc(Var Message : TMessage); procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
Delphi-Quellcode:
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.
FOriginalWndProc := TWincontrol(FControl).WindowProc
TWincontrol(FControl).WindowProc := MyWndProc; 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. |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
Zitat:
Zitat:
Zitat:
Was du nicht vergessen solltest ist, die original WindowProc wiederherzustellen, wenn deine Komponente freigegeben wird. |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
zum Nachsatz: mach in in SetControl und ähnlich auch in Destroy:
Delphi-Quellcode:
zu 1. : verstanden
if not Assigned(Value) then begin
if Assigned(FControl) then begin DeleteObject(FAssociateRegion); FAssociateRegion := CreateRectRgn( 0,1, FControl.Width,FControl.Height); SetWindowRgn(FControl.Handle, FAssociateRegion,True); TWinControl(FControl).WindowProc := FLsWndMethod; zu 2. : a) meinst Du mit "Deiner WindowProc" die MyWndProc (ursprünglich von mir zum Reagieren auf Paintereignisse des gekaperten TWincontrols gedacht) oder die (für mich bisher unsichtbare) WindowProc meiner eigenen Komponente? und: b) wenn MyWndProc gemeint ist, dann würde:
Delphi-Quellcode:
dazu führen, das eine mit
procedure TAngehangeneKomponente.MyWndProc(Var Message : TMessage);
begin if Message.Msg = CM_ENTER then Dispatch(Message); // ¿oder Dispatch(Message.Msg)? ...
Delphi-Quellcode:
in meiner Komponente deklarierte Prozedur abgearbeitet würde? (wenn ja, dann hätte ich endlich mal das Ende vom Wollknäul in der Hand :D )
procedure CMEnter(var Message : TMessage); message CM_ENTER;
Danke für die Antwort! |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
zu 2) -> b)!
(kurz und bündig! ;) :mrgreen:) |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
"Deine WindowProc" = MyWndProc
Delphi-Quellcode:
Mehr ist nicht notwendig. Dispatch verteilt die Message.Msg schon für dich.
procedure TAngehangeneKomponente.MyWndProc(Var Message : TMessage);
begin Dispatch(Message); end; |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
@Motzi: heisst das:
I. : b) ist gemeint, aber nicht so wie ich vermute oder: II.: b) ist gemeint, und auch so wie ich vermute? :-) @Alle: Was ist eigentlich mit dem Feld "Result" in der MessageStruktur, was darf/kann/muß man nach der Verarbeitung dort hinterlassen? |
Re: WindowProc, WMPaint ist das doppelt gemoppelt?
Zitat:
Bei deinem WM_PAINT kannst du aber nicht so vorgehen, wie in OnPaint. Du musst all die Dinge erledigen, die WMPaint von TWinControl für dich auch erledigt, bevor es die Methode Paint aufruft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz