![]() |
Subclassing der WndProc des übergeordneten Controls
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Zeit hab ichs mit den WndProcs...
Ich will meine Klasse ![]() 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. |
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 |
Re: Subclassing der WndProc des übergeordneten Controls
Zitat:
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. |
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 |
Re: Subclassing der WndProc des übergeordneten Controls
Zitat:
Delphi-Quellcode:
Und wenn ich das so mache, reagiert das Fenster nicht mehr.
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))); |
Re: Subclassing der WndProc des übergeordneten Controls
Oh, verdammt. Ein kleiner, aber verdammt fieser Fehler:
Delphi-Quellcode:
ist falsch. Es muss heißen:
CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
Delphi-Quellcode:
Mein Gott, bin ich froh, ich hatte schon befürchtet, diese ganze Subclassing-Sache würde doch anders laufen, als ich gedacht hatte.
Result := CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 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