如何使用delphi VCL组件对WinApi Edit控件进行子类化?

时间:2012-05-02 23:59:28

标签: delphi winapi

我正在尝试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;

1 个答案:

答案 0 :(得分:1)

TWinControlTEdit派生的)具有公共WindowHandle属性,您可以将非VCL HWND分配给该属性。只需确保在销毁TEdit之前将属性设置回0,或者执行任何可能导致其在内部调用其RecreateWnd()方法的操作,否则WinAPI控件将被销毁。并且不要使用任何需要TEdit.Parent属性的内容。