2

他のすべての上にあるはずの文字列をどのように描画しますか? 現在、私のパネルには、Panel1.Controls にいくつかのユーザー コントロールがあります。だから私はこれを Paint メソッドに追加しました:

Graphics g = Panel1.CreateGraphics();  
g.DrawString("BUSTED", new Font("Arial", 20f), new SolidBrush(Color.Black), new PointF(50, 50));

問題は、テキストがユーザー コントロールの背後に印刷されるため、表示されないことです。(開いているテキストの位置を変更すると、正しく表示されます)。

何か案は?

4

4 に答える 4

2

すべてのウィンドウ フォーム コントロールは HWND ベースです。つまり、それぞれに独自のウィンドウ ハンドルがあり、コントロールの z オーダー/親子によって、どのクリップが何をクリップするかが決まります。パネル ペイント イベントはパネル コントロールにペイントされますが、パネル コントロールの出力はすべての子コントロールによってクリップされます。

Windows フォームでは透過性が正しく機能しません。何かを透明な背景に設定すると、通常、直接の親ではなく、フォームの背景が透けて見えてしまいます。

私はこれをさまざまな方法で回避しました。

  1. すべてをビットマップにレンダリングしてから表示することで、すべての合成を自分で行います。これは静的コンテンツでのみ機能します。
  2. #1 のようにすべてをレンダリングするウィンドウレス レンダリング モデルを作成し、その構成要素とのマウス操作も処理します。
  3. コントロールをオーバーレイし、目的のコンテンツをレンダリングする新しいトップ レベルのレイヤード ウィンドウ (WS_EX_LAYERED) を作成します。これにより、メッセージを渡すための手順が実行されない限り、基になるコントロールとの対話が禁止されます。これは、Visual Studio 2008 が Windows フォーム デザイナー サーフェスに使用する方法だと思います。
于 2009-07-29T12:44:29.223 に答える
1

すべてのコントロールの上にあるパネルを追加してから、その中に描画してみてください。パネルには透過性を設定する必要があります。

詳細はこちら:パネル内のコントロールの上に描画する (C# WinForms)

于 2009-07-29T12:11:32.723 に答える
1

それが機能するかどうかはわかりませんが、パネル内のすべてのユーザー コントロールでSendToBackを試すことができます。その後、テキストが一番上に表示される可能性があります。

于 2009-07-29T12:48:38.210 に答える
0

Panel で OnPaint をオーバーライドし、ベース ペイントの後に描画コードを記述するのはどうですか?

class DrawingPanel : Panel {
    protected override void OnPaint(PaintEventArgs e)
    {
       base.OnPaint(e);

       // Your drawing code here


    }
}
于 2009-07-29T12:44:25.950 に答える