(派生クラスでメソッドをオーバーライドするのではなく)Paint
イベントを処理すると、基本クラス (既定の proc ハンドラー) が既に呼び出されています。すべてが通常どおりに描画され、イベントでは基本的にその上に描画されます。ここでそれをはっきりと見ることができます:OnPaint
Paint
秘訣は、必要な部分を表示するために、コントロールのクリッピング四角形を十分に露出させておくことです。このプロパティはボタンのクライアント領域全体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 の同等物を単純にラップするコントロールを必要とします。この方法を選択すると、自分でコードを明示的に記述したため、呼び出したい基本クラス レンダラーの部分を正確に制御できます。あなたがいるなら強くお勧めします
MainMenu
ToolBar
UI、ネイティブ感、ユーザー エクスペリエンスをまったく気にしないタイプ。