2013-02-06 10 views
6

私はTCustomButtonから派生したカスタムボタンコンポーネントを持っています。私のボタンは自分の絵などで[OK]を動作しますが、私は何をしたいのはどのオブジェクトインスペクタにブールプロパティを提供しているCreateParamsを動的に変更しますか?

procedure TMyButton.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 
    with Params do 
    begin 
    Style := Style or BS_OWNERDRAW; 
    end; 
end; 

:それは私はそうのようなCreateParamsををオーバーライドしているownerdrawnようにするに

それがオーナーディルドかどうかを私のボタンに伝えるのに使うことができます。

たとえば、プロパティが有効になっている場合、ボタンは自分のペイントルーチンでオーナー描画ボタンとしてペイントします。プロパティがオフになっている場合は、テーマのWindowsボタンスタイル(通常のTButtonなど)としてペイントする必要があります。

CreateParamsを、それがownerdawnしなければならない私のボタンを伝えますが、私はそれがownerdrawnすべきかどうかのボタンを伝えるためのオプションを提供したいです。実行時にデザイン時またはコードでプロパティを変更することで、私は自分のボタンにオーナー描画するかどうかを伝えたいと思います。

どうすればいいですか?

答えて

10

プロパティの追加とCreateParamsはそれに応じて動作させることは、私が思う問題ではありません。新しい設定をすぐに有効にすると、おそらくそうです。プロパティがトグルされる

コールRecreateWnd。これにより、オーバーライドされたCreateParamsルーチンの使用を含む、現在のWindowsハンドルを削除し、再作成します。すべてのすべてで

type 
    TMyButton = class(TButtonControl) 
    private 
    FOwnerDraw: Boolean; 
    procedure SetOwnerDraw(Value: Boolean); 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    published 
    property OwnerDraw: Boolean read FOwnerDraw write SetOwnerDraw 
     default False; 
    end; 

procedure TMyButton.CreateParams(var Params: TCreateParams); 
const 
    OwnerDraws: array[Boolean] of DWORD = (0, BS_OWNERDRAW); 
begin 
    inherited CreateParams(Params); 
    Params.Style := Params.Style or OwnerDraws[FOwnerDraw]; 
end; 

procedure TMyButton.SetOwnerDraw(Value: Boolean); 
begin 
    if FOwnerDraw <> Value then 
    begin 
    FOwnerDraw := Value; 
    RecreateWnd; 
    end; 
end; 
+0

RecreateWndは、私が今知っている魔法の言葉でした:) –

5

あなたはこのようにそれを行うことができます。

  1. OwnerDrawプロパティを確認します。
  2. そのプロパティをCreateParamsでテストし、それに応じて動作を切り替えます。
  3. プロパティが変更されるたびにRecreateWndを呼び出します。

アイテム3の代わりに、SetWindowLongを呼び出してウィンドウスタイルを変更するだけで済みます。これを試行する前に、HandleAllocatedをテストしてください。ウィンドウを強制的に強制的に作成する必要はありません。しかし、これが起こるときはいつも、ペイントサイクルを強制する必要があるでしょう。

個人的には、私はウィンドウレクリエーションを強制する傾向があると思います。

+0

「強制的にペイントサイクルを行う」とは、コントロールに無効を送信することを意味しますか?あなたの答えとNGLNのことがわかっていれば、RecreateWndはCreateParamsを呼び出して簡単なチェックでネイティブスタイルに変更し、プロパティの状態をテストします。 –

+1

'Invalidate'はペイントサイクルを強制します。 'RecreateWnd'は' CreateParams'を呼び出さないことに注意してください。それは単にウィンドウを破壊するだけです。コントロールが次にウィンドウハンドルを必要とすると、コントロールが作成され、次に 'CreateParams'が呼び出されます。ウィンドウハンドルは必要に応じて作成されます。 –

+0

私はそれをクリアしてくれてありがとう、私はまだ別のキーワードを 'RecreateWnd'で学んだようです:) –

関連する問題