2012-03-05 10 views
5

フラットスタイリングで使用する場合のComboBoxesのデフォルトの境界線の色は、基本的にSystemColors.Windowであるため、ツールストリップの一部のToolStripComboBoxコントロールの境界線の色を変更したいと考えています。ツールストリップのデフォルトのコントロールカラーに対しては見えません。 ComboBoxのレンダリングの背後にあるすべてのインフラストラクチャは非常に内部およびプライベート・インタフェースの後ろに保護されていますので、リフレクターの中を掘り、多くの後、私は、これを行うための任意の明白な方法が表示されません。 ToolStripsの外フラットスタイルのToolStripComboBoxの境界を変更する

、私はコンボボックスに境界線の色を固定するために提案見た一般的な解決策は、コンボボックスのサブクラスWndProcメソッドをオーバーライドし、そして手動で境界線を描くことです。内部ComboBoxコントロールは、私がコントロールのインスタンスを置き換えるために見ることができない方法で、コンボボックスの独自のプライベートサブクラスであるので、これはToolStripComboBoxコントロールのために働くことはできません。私が検討している

代替ソリューションは、私は境界線を描画することができますが、その後、私はプロのレンダラの調整の一部を放棄する必要がToolStripControlHost、に拡張コンボボックスオブジェクトの1つを入れています。私が気づいた副次的な欠点は、マウスオーバー時に時折ちらつきが発生することです。

WPFに自分のデザインを切り替えると、受け入れ可能な解決策ではありません。これはToolStripControlHost代替の上に何を得ないとして境界線を描画するための、親コントロール内のコントロールをラップすると、また、受け入れられません。

誰もがこの問題を解決する巧妙な解決策を持っているか、既存のComboBoxフラットスタイルのレンダリングスタックを既存の(許可された)再実装して、既存の欠点を修正していますか?実装?ここで

答えて

2

はそれを動作させるための方法です... :)

のソートはToolStripPaintイベントのイベントハンドラを作成します。次に、ToolStripComboBoxesのすべてをループし、周囲に長方形をペイントします。

private Color cbBorderColor = Color.Gray; 
    private Pen cbBorderPen = new Pen(SystemColors.Window); 

    private void toolStrip1_Paint(object sender, PaintEventArgs e) 
    {    
     foreach (ToolStripComboBox cb in toolStrip1.Items) 
     { 
      Rectangle r = new Rectangle(
       cb.ComboBox.Location.X - 1, 
       cb.ComboBox.Location.Y - 1, 
       cb.ComboBox.Size.Width + 1, 
       cb.ComboBox.Size.Height + 1); 

      cbBorderPen.Color = cbBorderColor; 
      e.Graphics.DrawRectangle(cbBorderPen, r); 
     } 
    } 

はここ(あなたがカットオフされてからペイントされたボーダーを防ぐためのToolStripの高さを調整する必要があることに注意してください)、それは次のようになります。

enter image description here

1

改善: 、ToolStripの項目の種類を確認し、それは例えばtoolstipLabelであればそのプログラムが鎮圧しません。

foreach (var item in toolStrip1.Items) 
{ 
     var asComboBox = item as ToolStripComboBox; 
     if (asComboBox != null) 
     { 
      var location = asComboBox.ComboBox.Location; 
      var size = asComboBox.ComboBox.Size; 
      Pen cbBorderPen = new Pen(Color.Gray); 
      Rectangle rect = new Rectangle(
        location.X - 1, 
        location.Y - 1, 
        size.Width + 1, 
        size.Height + 1); 

      e.Graphics.DrawRectangle(cbBorderPen, rect); 
     } 

}

関連する問題