画面・グラフィック
- コンボボックスの背景にオーナードローで着色する
コンボボックスの背景にオーナードローで着色することで、選択されているリストインデックスに対応してコンボボックスの色が変わるようになります。
/// <summary>コンボボックスの各リストアイテムを色分けする。</summary>
/// <example>
/// <code>
/// comboBox1.Initialize();
/// comboBox1.Items.Add( "1" );
/// comboBox1.Items.Add( "2" );
/// comboBox1.Items.Add( "3" );
///
/// comboBox1.AddColor( Color.Red );
/// comboBox1.AddColor( Color.Green );
/// comboBox1.AddColor( Color.Blue );
/// </code>
/// </example>
public class ColorComboBox : ComboBox
{
private List<Color> _listColors;
/// <summary>コンストラクタ</summary>
public ColorComboBox()
{
}
/// <summary>初期化処理</summary>
public void Initialize()
{
this.ForeColor = Color.White;
_listColors = new List<Color>();
this.DrawMode = DrawMode.OwnerDrawFixed;
this.DrawItem += new DrawItemEventHandler( ColorComboBox_DrawItem );
this.SelectedValueChanged += new EventHandler( ColorComboBox_SelectedValueChanged );
}
/// <summary>色追加</summary>
/// <param name="color">色</param>
public void AddColor( Color color )
{
_listColors.Add( color );
}
/// <summary>コンボボックス選択変更時、背景をインデックスに対応する色に変える</summary>
private void ColorComboBox_SelectedValueChanged( object sender, EventArgs e )
{
this.BackColor = GetBackColor( this.SelectedIndex );
}
/// <summary>インデックスに対応する色を取得</summary>
/// <remarks></remarks>
/// <param name="nIndex">インデックス</param>
/// <returns>インデックスに対応する色</returns>
private Color GetBackColor( int nIndex )
{
if( nIndex < 0 ) return Color.White;
if( nIndex >= _listColors.Count ) return Color.White;
return _listColors[ nIndex ];
}
/// <summary>コンボボックスのリストのオーナードロー実装</summary>
private void ColorComboBox_DrawItem( object sender, DrawItemEventArgs e )
{
// 描画エリア
Rectangle rectangle = new Rectangle( e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height );
if( e.State == DrawItemState.None )
{
// アライメント
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Near;
// インデックスに対応する背景色で描画
Color backColor = GetBackColor( e.Index );
e.Graphics.FillRectangle( new SolidBrush( backColor ), rectangle );
// テキスト描画
string szText = this.Items[ e.Index ].ToString();
e.Graphics.DrawString( szText, this.Font, new SolidBrush( Color.White ), rectangle, format );
}
}
}