2012-05-02 116 views
1

我正在尝试subclassWinApi edit control并重写paint方法。到目前为止我使用SetWindowLong函数和GWL_WNDPROC标志来重写原始窗口过程,然后我收到WM_PAINT消息并使用我自己的Paint逻辑,这是工作良好,但我想知道是否有可能创建一个shadow TEdit组件并将Winapi编辑控件的原始句柄传递给Delphi TEdit组件,这样我就可以使用阴影TEdit来获取和设置EDIT控件的属性。那可能吗?使用delphi VCL组件如何子类化WinApi Edit控件?

更新

继雷米建议有关使用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

什么是影子组件?这是德尔福的概念吗?由“影子” –

+0

我的意思是创建一个“假”TEdit VCL控件。 – Salvador

+0

好的。那么在这种情况下,我并不知道WinAPI中的任何功能都可以用来编辑可执行文件的资源文件(如果存在的话)。 –

回答

1

TWinControl(其中TEdit从派生)具有公共属性WindowHandle,你可以指定一个非VCL HWND来。在销毁TEdit或做任何可能导致它在内部调用其RecreateWnd()方法的任何操作之前,请务必将该属性设回0,否则WinAPI控件将被破坏。并且不要使用任何要求TEdit.Parent属性有意义的东西。

+0

我们甚至可以确定他说“外部应用程序”时的含义。 –

+0

我尝试使用您的建议,但无法正常工作,您能否向我展示基本代码示例或查看我更新的问题? – Salvador

+0

你试图用'Color'属性做什么都行不通。看到我对你编辑的问题的其他评论。任何涉及父窗口接收消息的功能都将不起作用,除非您也编辑Edit控件的父窗口。 –