1

WinApi 編集コントロールをサブクラス化し、ペイント メソッドをオーバーライドしようとしています。これまでのところ、SetWindowLong関数とGWL_WNDPROCフラグを使用して元のウィンドウ プロシージャをオーバーライドしてから、WM_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

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

于 2012-05-03T00:30:55.130 に答える