2012-05-02 41 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控件的父窗口。 –