2012-05-02 5 views
1

私はsubclassWinApi edit controlをしようとしており、ペイント方法をオーバーライドしています。これまでのところ、SetWindowLong関数とGWL_WNDPROCフラグを使用して元のウィンドウプロシージャをオーバーライドすると、WM_PAINTメッセージが表示され、自分のペイントロジックを使用していますが、これはうまくいきましたが、 TEditコンポーネントとWinapi EDITコントロールの元のハンドルをDelphi TEditコンポーネントに渡します。そうすることで、シャドーTEditを使用してEDITコントロールのプロパティを取得および設定できます。それは可能ですか?delphi VCLコンポーネントを使用してWinApi Editコントロールをサブクラス化する方法はありますか?

更新

私はこのコードで終了WindowHandleプロパティを使用しますが、動作していない程度レミーの提案(エディットコントロールの色を設定することが影響していない)に続き。 (TEditから派生)

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

シャドウコンポーネントとは何ですか?それはDelphiのコンセプトですか? –

+0

"shadow"とは、 "偽の" TEdit VCLコントロールを作成することを意味します。 – Salvador

+0

申し訳ありません。その場合、WinAPIの機能のうち、実行可能ファイルのリソースファイルを編集することができないような機能(存在する場合)を認識できません。 –

答えて

1

TWinControlあなたは、非VCL HWNDを割り当てることができますパブリックWindowHandle性質を持っています。 TEditを破壊する前に、プロパティを0に戻してください。または、RecreateWnd()メソッドを内部的に呼び出す可能性のあるものを実行してください。そうしないと、WinAPIコントロールが破棄されます。そして、意味のあるものには、TEdit.Parentプロパティを必要とするものは使用しないでください。

+0

「外部アプリケーション」とは何を意味するのかを確認するにはどうすればいいでしょうか。 –

+0

私はあなたの提案を使用しようとしましたが、動作していません。私に基本的なコードサンプルを表示したり、更新された質問を確認できますか? – Salvador

+0

'Color'プロパティで何をしようとしても動作しません。あなたの編集した質問に対する私の他のコメントを参照してください。親ウィンドウがメッセージを受け取ることに関わる機能は、編集コントロールの親ウィンドウをサブクラス化しないかぎり、機能しません。 –

関連する問題