AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WindowProc, WMPaint ist das doppelt gemoppelt?
Thema durchsuchen
Ansicht
Themen-Optionen

WindowProc, WMPaint ist das doppelt gemoppelt?

Ein Thema von Leuselator · begonnen am 27. Aug 2003 · letzter Beitrag vom 27. Aug 2003
Antwort Antwort
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#1

WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 09:18
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.
Tim Leuschner
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 10:09
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 ).

Was du nicht vergessen solltest ist, die original WindowProc wiederherzustellen, wenn deine Komponente freigegeben wird.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 10:38
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
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 )

Danke für die Antwort!
Tim Leuschner
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#4

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 10:50
zu 2) -> b)!
(kurz und bündig! )
Manuel Pöter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 11:03
"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.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#6

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 11:03
@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?
Tim Leuschner
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: WindowProc, WMPaint ist das doppelt gemoppelt?

  Alt 27. Aug 2003, 11:08
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 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