![]() |
Messagen Subclassen
Hab noch ein problem mit der Magnetic Unit
Mich nervt das ich innerhalb der anwendung Messagen aus der WinProc extra an die Unit schicken muss. Hat jemand eine ahnung wie ich es bewerkstelligen kann WM_ Messagen der Subclass hinzuzufügen ohne sie aus der Anwendung übergeben zu müssen ? Ich möchte als Beispiel WM_ENTERSIZEMOVE von der Anwendung an die Subclass übergeben das dieses erkennt wenn die Message aufgrufen wird. Im moment geht es nur wenn ich aus der Anwendung selbst diese übergebe
Delphi-Quellcode:
Sinnvoller wäre es diese hier zu addieren sobald das Window addiert wird.
MagneticWndProc(MainWindow(0), WM_ENTERSIZEMOVE, Msg, dummyHandled);
Delphi-Quellcode:
function TMagnetic.AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
begin Subclass_AddMsg(Handle, WM_ENTERSIZEMOVE) //<<<< end; Hoffe jemand versteht was ich meine. gruss Emil |
Re: Messagen Subclassen
Sorry ich Pushe
Vielleicht schaut doch noch jemand in den thread ;) Habe eine möglichkeit gefunden die Messagen zu hooken innerhalb der Anwendung. das problem ist nun das nur noch die Hauptform andockt an den SubFormen.. müßte da noch ne möglichkeit schaffen die Messagen zu enumerieren. Ich erstelle eine ObjectInstance
Delphi-Quellcode:
und leite die Messsagen auf die Original Winproc um.
if AppHandle = 0 then
begin AppHandle := Handle; FClientInstance := MakeObjectInstance(ClientWndProc); FPrevClientProc := Pointer(GetWindowLong(Handle, GWL_WNDPROC)); SetWindowLong(Handle, GWL_WNDPROC, Integer(FClientInstance)); end;
Delphi-Quellcode:
Geht bestimmt eleganter wenn jemand eine lösung hat dann bitte mitteilen :)
procedure TMagnetic.ClientWndProc(var Message: TMessage);
begin with Message do begin case Msg of WM_ENTERSIZEMOVE: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, dummyHandled); WM_SIZING: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, bHandled); WM_SYSCOMMAND: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, dummyHandled); WM_MOVE: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, dummyHandled); WM_EXITSIZEMOVE: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, dummyHandled); WM_WINDOWPOSCHANGING: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, dummyHandled); WM_MOVING: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, bHandled); WM_COMMAND: zSubclass_Proc(AppHandle, integer(Msg), Message.WParam, Message.LParam, Message.Result, bHandled); end; if (Result = 0) then Result := CallWindowProc(FPrevClientProc, AppHandle, Msg, wParam, lParam); end; end; So brauche ich keine eigene Winproc in der anwendung und eine zeile reicht um den Magentic Effekt zu Initialisieren. Anwendung:
Delphi-Quellcode:
und das Child
MagneticWnd.AddWindow(Self.Handle, 0, MagneticWndProc);
Delphi-Quellcode:
Gruss Emil
MagneticWnd.AddWindow(frmChild2.Handle, self.Handle, MagneticWndProc)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 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