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 Subclassing der WndProc des übergeordneten Controls (https://www.delphipraxis.net/6616-subclassing-der-wndproc-des-uebergeordneten-controls.html)

Chewie 16. Jul 2003 21:55


Subclassing der WndProc des übergeordneten Controls
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Zeit hab ichs mit den WndProcs...

Ich will meine Klasse THexListView etwas aufmotzen. Konkret will ich ein ReadOnly-Mutliline-Edit wieder weiß färben. Wie das geht, weiß ich, allerdings werden die WM_CTLCOLORSTATIC-Messages ja an das übergeordnete Control geschickt, und dessen WndProc ist ja nicht in der Klasse enthalten. Also dacht ich mir, subclasse ich die WndProc in der Unit mit der HexView-Klasse, fange dort das Ereignis ab und ruf dann die ursprüngliche WndProc auf.
Allerdings wird die ursprüngliche scheinbar nicht aufgerufen.

Ich häng mal die ganze Unit an, denn die ist etwas zu lang, um hier gut gelesen werden zu können.
Das Subclassing passiert übrigens im Konstruktor.

negaH 16. Jul 2003 22:58

Re: Subclassing der WndProc des übergeordneten Controls
 
So einfach geht das aber nicht. Für jedes Fenster muß separat ge-sub-classed (welch wort:) werden.

Also schau die mal bei TControl die Eigenschaft WndProc an. Dort steht ein Event das auf die MainWndProc, sprich die Fensterprocedure des Controls zeigt. Also ganz einfach dieses Event sichern und seine eigene Fenstermethode installieren. In dieser dann die vorher gesicherte Methode aufrufen.

Gruß Hagen

Chewie 17. Jul 2003 20:31

Re: Subclassing der WndProc des übergeordneten Controls
 
Zitat:

Zitat von negaH
So einfach geht das aber nicht. Für jedes Fenster muß separat ge-sub-classed (welch wort:) werden.

Ich subclasse ja ein einzelnes Fenster. Das Programmfenster (in der VCL Form genannt). Oder steh ich da auf dem Schlauch?

Und das Anschauen der Sourcen hilft mir leider auch nicht viel. Da wird ja der ganze TComponent-Krams verwendet, ich dagegen baue direkt auf der API und TObject auf.

negaH 18. Jul 2003 11:56

Re: Subclassing der WndProc des übergeordneten Controls
 
Ah, wie dumm, denn dann geht mein Vorschlag natürlich nicht.
In der VCL hat jedes Control die Fensterprocedure in einer Event-Methode gespeichert. Genau diese kann man extrem einfach umbiegen auf eine egene Methode. Das ist easy und der Vorteil ist as man alle Messages bekommt auch wenn das Control noch kein Fensterhandle hat.

In deinem Fall musst dann wohl oder übel das fensterhandle mit SetWindowLong() subclassen.

Gruß Hagen

Chewie 18. Jul 2003 12:03

Re: Subclassing der WndProc des übergeordneten Controls
 
Zitat:

Zitat von negaH
In deinem Fall musst dann wohl oder übel das fensterhandle mit SetWindowLong() subclassen.

Genau das mach ich ja:
Delphi-Quellcode:
var
  OldParentWndProc: Pointer;

function NewParentWndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: lParam):
  lResult; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_CTLCOLORSTATIC:
      begin
        SetBkColor(HDC(wParam), RGB(255, 255, 255));
        Result := RGB(255, 255, 255);
      end;
  else
    CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
  end;
end;

//Subclassing durchführen
OldParentWndProc := Pointer(SetWindowLong(hWndParent, GWL_WNDPROC,
    Integer(@NewParentWndProc)));
Und wenn ich das so mache, reagiert das Fenster nicht mehr.

Chewie 18. Jul 2003 12:10

Re: Subclassing der WndProc des übergeordneten Controls
 
Oh, verdammt. Ein kleiner, aber verdammt fieser Fehler:
Delphi-Quellcode:
CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
ist falsch. Es muss heißen:
Delphi-Quellcode:
Result := CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
Mein Gott, bin ich froh, ich hatte schon befürchtet, diese ganze Subclassing-Sache würde doch anders laufen, als ich gedacht hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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