Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WindowProc, WMPaint ist das doppelt gemoppelt? (https://www.delphipraxis.net/8019-windowproc-wmpaint-ist-das-doppelt-gemoppelt.html)

Leuselator 27. Aug 2003 08:18


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:
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.

jbg 27. Aug 2003 09:09

Re: WindowProc, WMPaint ist das doppelt gemoppelt?
 
Zitat:

Zitat von Leuselator
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)?

CM_ENTER/CM_EXIT kommen auch in deiner WindowProc an.

Zitat:

2. Liege ich mit der Trennung WMPaint/WindowProc richtig, oder kommen in MyWndProc Aufgrund der Deklaration auch meine eigenen Ereignisse vorbeigehuscht?
Standardmäßig leitet deine WindowProc diese Botschaften nicht weiter an die messages. Du brauchst aber in deiner WindowProc nur Dispatch(Msg) aufrufen um die Ereignisse an die message Methoden zu weiterzuleiten.

Zitat:

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.
Man kann nicht alle Funktionen kennen (aber fast alle :lol: ).

Was du nicht vergessen solltest ist, die original WindowProc wiederherzustellen, wenn deine Komponente freigegeben wird.

Leuselator 27. Aug 2003 09:38

Re: WindowProc, WMPaint ist das doppelt gemoppelt?
 
zum Nachsatz: mach in in SetControl und ähnlich auch in Destroy:
Delphi-Quellcode:
    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 1. : verstanden
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:
procedure TAngehangeneKomponente.MyWndProc(Var Message : TMessage);
begin
  if Message.Msg = CM_ENTER
    then Dispatch(Message); // ¿oder Dispatch(Message.Msg)?
    ...
dazu führen, das eine mit
Delphi-Quellcode:
procedure CMEnter(var Message : TMessage); message CM_ENTER;
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 )

Danke für die Antwort!

Motzi 27. Aug 2003 09:50

Re: WindowProc, WMPaint ist das doppelt gemoppelt?
 
zu 2) -> b)!
(kurz und bündig! ;) :mrgreen:)

jbg 27. Aug 2003 10:03

Re: WindowProc, WMPaint ist das doppelt gemoppelt?
 
"Deine WindowProc" = MyWndProc


Delphi-Quellcode:
procedure TAngehangeneKomponente.MyWndProc(Var Message : TMessage);
begin
  Dispatch(Message);
end;
Mehr ist nicht notwendig. Dispatch verteilt die Message.Msg schon für dich.

Leuselator 27. Aug 2003 10:03

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?

jbg 27. Aug 2003 10:08

Re: WindowProc, WMPaint ist das doppelt gemoppelt?
 
Zitat:

Zitat von Leuselator
Was ist eigentlich mit dem Feld "Result" in der MessageStruktur, was darf/kann/muß man nach der Verarbeitung dort hinterlassen?

Das kommt auf die Botschaft an. Nähere Informationen zu den jeweiligen Botschaften findest du im PSDK und in der WindowsSDK Hilfe.


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 00:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz