1

我正在尝试子类WinApi 编辑控件并覆盖绘制方法。到目前为止,我正在使用SetWindowLong函数和GWL_WNDPROC标志来覆盖原始窗口过程,然后我收到 WM_PAINT 消息并使用我自己的 Paint 逻辑,这很好用,但我想知道是否可以创建阴影TEdit组件并将 Winapi EDIT 控件的原始句柄传递给 Delphi TEdit 组件,这样我就可以使用影子 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;
4

1 回答 1

1

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

于 2012-05-03T00:30:55.130 回答