我正在尝试subclass WinApi edit control并覆盖paint方法。到目前为止,我正在使用SetWindowLong函数和 GWL_WNDPROC 标志来覆盖原始窗口过程,然后我收到WM_PAINT消息并使用我自己的Paint逻辑,这很好,但是我想知道是否可以创建 shadow TEdit组件并将Winapi EDIT控件的原始句柄传递给Delphi TEdit组件,这样我就可以使用shadow TEdit来获取和设置属性EDIT控件。这可能吗?
更新
根据Remy关于使用WindowHandle
属性的建议,我以此代码结束,但无法正常工作(设置编辑控件的颜色无效)。
type
TWinControlCracker= class(TWinControl);
Var
ShadowEdit : TEdit;
newWndProc : Pointer;
EditHandle : NativeInt;
begin
EditHandle:=$00320530;//this is the handle to the EDIT control
ShadowEdit:=TEdit.Create(nil);
TWinControlCracker(ShadowEdit).WindowHandle:=EditHandle;
newWndProc := MakeObjectInstance(ShadowEdit.WindowProc);
SetWindowLong(EditHandle, GWL_WNDPROC, NativeInt(newWndProc));
ShadowEdit.Color:=clLime;
ShadowEdit.Refresh;
end;
答案 0 :(得分:1)
TWinControl
(TEdit
派生的)具有公共WindowHandle
属性,您可以将非VCL HWND
分配给该属性。只需确保在销毁TEdit
之前将属性设置回0,或者执行任何可能导致其在内部调用其RecreateWnd()
方法的操作,否则WinAPI控件将被销毁。并且不要使用任何需要TEdit.Parent
属性的内容。