2

コントロールのカスタム動作を書いていますToolStripDropDownToolStripDropDownButtonまた、それ自体を変更して、色付きの形状を表示したいと思います。

Paintイベントを処理し、好きなものを描くことができることがわかりました。ただし、形状をペイントする前に、ボタンにデフォルトの背景をペイントさせる方法はありますか? 特に将来のバージョンの .NET と Windows では、背景を正確に正しく表示するのは難しいでしょう。

普通の Windows では、ペイント コードの前または後にデフォルトの proc ハンドラを呼び出すことができました。.NET でそれを達成する方法は見当たりません。または、ボタンに背景のみをペイントするように指示する方法はありますか?

4

1 に答える 1

2

(派生クラスでメソッドをオーバーライドするのではなく)Paintイベントを処理すると、基本クラス (既定の proc ハンドラー) が既に呼び出されています。すべてが通常どおりに描画され、イベントでは基本的にその上に描画されます。ここでそれをはっきりと見ることができます:OnPaintPaint

     ドロップダウン ボタンの一部の上に描画されたライムの四角形で、下にデフォルトのコンテンツがはっきりと表示されています

秘訣は、必要な部分を表示するために、コントロールのクリッピング四角形を十分に露出させておくことです。このプロパティはボタンのクライアント領域全体e.ClipRectangleを取得するため、色見本だけで 塗りつぶすと、ドロップダウン矢印とデフォルトの背景も隠れてしまいます。上記のデモは、次の醜いサンプル コードを使用して作成されました。

private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.Chartreuse,
                             e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
                             e.ClipRectangle.Width - 12,
                             e.ClipRectangle.Height - 12);
}

それ以外に、基本クラスによって正確に描画されるものをカスタマイズする方法はないと思います。所有者による描画 (少なくとも WinForms では) は、全か無かの問題になりがちです。完全に制御できますが、
すべてを自分で実装しなければならないという代償が伴います。


もちろん、まだお気づきでない方のために説明すると、このコントロールToolStripはネイティブの Windows コントロールとはまったく異なります。さらに悪いことに 、UI を完全にオーバーホールする Windows の将来のバージョンでも、常に現在とまったく同じように表示されます。(はこれと同じ現象に悩まされ ており、標準 API メニューが大幅に変更された Windows Vista/7 では違いが非常に顕著です)。その理由は、両方のコントロールが WinForms 実装で記述された C# コードで完全に描画されるためです。個人的には、ばかばかしいほど安っぽく見え、賭けのアプリケーションの 1 つでは使用しないと思います。
MenuStrip

UxTheme API を使用してボタンを描画するカスタム レンダラーを割り当てることができます。これにより、ネイティブ メニューとツールバーの外観にかなり近づけることができます。かなり完全なサンプルはこちらから入手できます。私が行った WinForms 開発用に非常によく似たものを書きましたが、これは従来のクラスでは提供されないクラスの追加機能 (ToolStripコンボ ボックスの埋め込みなど)と、Windows API の同等物を単純にラップするコントロールを必要とします。この方法を選択すると、自分でコードを明示的に記述したため、呼び出したい基本クラス レンダラーの部分を正確に制御できます。あなたがいるなら強くお勧めします
MainMenuToolBar
UI、ネイティブ感、ユーザー エクスペリエンスをまったく気にしないタイプ。

于 2011-02-19T05:38:07.087 に答える