0

ツールバースタイルのコントロールを作成していて、ThemeServicesユニットを使用してツールバーに必要な背景をペイントしています。そのようです:

ThemeServices.DrawElement(Canvas.Handle, 
  ThemeServices.GetElementDetails(trRebarRoot), ARect);

次に、子コントロールをツールバーと出来上がり(インスタントツールバー)にドロップします。ネストされた(子)コントロールも再描画されないことに時々気付くのを除いて。したがって、私のコントロールはその背景をペイントし、子コントロールはマウスをそれらの上に移動するまで消えます。

一部の編集コントロールにはクライアント領域(境界線なし)が表示され、一部は完全に削除されています。

これは主に、別のアプリケーションのウィンドウをツールバーの上に配置して移動したときに発生します。

これは非常に簡単に解決できる必要があると私は考え続けています。おそらく、ペイントメッセージが子コントロールに到達するのを妨げているか、オーバーライドを見逃しているのかもしれませんが、それを理解できませんでした。

4

3 に答える 3

1

これは、別のウィンドウコントロールで覆われているときに、キャンバスを再描画する必要があるのは正常なことです。

コンテナコントロールのOnPaintイベントでツールバーを描画する必要があります。

于 2010-03-24T18:38:02.007 に答える
1

これが正しく機能し、WM_NCPaintから子コントロールをオーバーペイントしないようにするには、ウィンドウのGDI領域関数を使用して、ペイントしたくない領域を除外するクリッピング領域を作成できます。

これを行うには、背景のサイズでCreateRectRgn(または同様の)関数を使用してリージョンを作成します。

SelectClipRgn関数を使用して、使用しているDCにこの領域を選択します。

次に、ツールバー/パネルの最上位の子ウィンドウをループし、各子に適切な座標を使用してExcludeClipRectを呼び出します。

最後にペイントすると、除外されていない領域のみがペイントされます。

また、地域を整理する必要がある場合があることにも注意してください(GDIヘルプを確認することをお勧めします)。

于 2010-03-25T12:46:23.807 に答える
0

OK、私は自分で問題を見つけました。WM_NCPAINTで背景を描いていたのは、それが実際には少しずつ描くことができないグラデーションの背景だからです。クライアントコントロールを再描画せずにWM_NCPAINTが呼び出されることがよくあることに気づきませんでした。そのため、背景をWM_NCPAINTだけでなく、WM_PAINTでもペイントします。後者は、境界線を除外し、前者にクライアント領域をクリップさせるためにすでにクリップされています。私はExcludeClipRectと呼びました。

これは御馳走のように機能します。

于 2010-03-25T10:39:49.130 に答える