public partial class GradientColorComboBox : UserControl
{
private Color m_StartColor;
private Color m_EndColor;
/// <summary>
/// 封装字段
/// </summary>
public Color StartColor
{
get { return m_StartColor; }
set { m_StartColor = value; }
}
/// <summary>
/// 封装字段
/// </summary>
public Color EndColor
{
get { return m_EndColor; }
set { m_EndColor = value; }
}
/// <summary>
/// Combobox颜色选择发生变化时激发的事件
/// </summary>
public event EventHandler SelectColorChanged;
//预定义的渐变色
private static string[] colorList ={
"AliceBlue|Green","Aqua|Aquamarine","Red|SkyGreen",
"Bisque|Black","BlanchedAlmond|Blue","BlueViolet|Brown",
"BurlyWood|CadetBlue","Chartreuse|Chocolate",
"CornflowerBlue|Cornsilk","Crimson|Cyan","DarkBlue|DarkCyan",
"DarkGoldenrod|DarkGray","DarkGreen|DarkKhaki",
"DarkMagenta|DarkOliveGreen","DarkOrange|DarkOrchid"
};
/// <summary>
/// 构造函数
/// </summary>
public GradientColorComboBox()
{
InitializeComponent();
PersonalizeComponent();
}
/// <summary>
/// 加载各颜色项(Items)
/// </summary>
private void PersonalizeComponent()
{
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
this.comboBox1.ItemHeight = 18;
this.comboBox1.BeginUpdate();
this.comboBox1.Items.Clear();
foreach (string oneColor in colorList)
{
this.comboBox1.Items.Add(oneColor);
}
this.comboBox1.EndUpdate();
}
/// <summary>
/// 绘制颜色矩形,每次添加Item时都会触发该事件,该函数由在ComboBox的属性标签的事件栏下双击DrawItem自动生成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
return;
Rectangle rect = e.Bounds;
//读取起始、终止颜色值
string startColorName = comboBox1.Items[e.Index].ToString().Split('|')[0];
string endColorName = comboBox1.Items[e.Index].ToString().Split('|')[1];
m_StartColor = Color.FromName(startColorName);
m_EndColor = Color.FromName(endColorName);
//选择线性渐变刷子
LinearGradientBrush brush = new LinearGradientBrush(rect, m_StartColor, m_EndColor, 0, false);
rect.Inflate(-1, -1);
// 填充颜色
e.Graphics.FillRectangle(brush, rect);
// 绘制边框
e.Graphics.DrawRectangle(Pens.Black, rect);
}
/// <summary>
/// 在ComboBox选择项改变触发事件中激活颜色传递事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (SelectColorChanged != null)
{
SelectColorChanged(this, e);
}
}
}