更改您的组合框DrawMode https://msdn.microsoft.com/en-us/library/system.windows.forms.drawmode(v=vs.110).aspx to OwnerDrawVariable
.
使用DrawItem https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem(v=vs.110).aspx事件来从 ComboBox 项边界内的源(在本例中为 ImageList)绘制图像。
如果组合框下拉样式 https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.dropdownstyle(v=vs.110).aspx被设定为DropDownList
,图像将显示在选择框中;如果设置为DropDown
,仅绘制文本。
这里,仅当鼠标点悬停在 ListControl 的项目上时才绘制 Focus 矩形,而在选择项目时则不会使用它,这是由以下因素决定的:
(e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit))
.
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0) return;
var cbo = sender as ComboBox;
Color foreColor = e.ForeColor;
if (e.State.HasFlag(DrawItemState.Selected) && !(e.State.HasFlag(DrawItemState.ComboBoxEdit))) {
e.DrawBackground();
e.DrawFocusRectangle(); // <= could be removed for a cleaner rendering
}
else {
using (var brush = new SolidBrush(cbo.BackColor)) {
var rect = e.Bounds;
rect.Inflate(1, 1);
e.Graphics.FillRectangle(brush, rect);
}
foreColor = cbo.ForeColor;
}
TextRenderer.DrawText(e.Graphics, cbo.GetItemText(cbo.Items[e.Index]), e.Font,
new Point(e.Bounds.Height + 10, e.Bounds.Y), foreColor);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawImage(imageList1.Images[e.Index],
new Rectangle(e.Bounds.Location,
new Size(e.Bounds.Height - 2, e.Bounds.Height - 2)));
}
The 神奇数字 here (10, -2
) 只是偏移量:
e.Bounds.Height + 10 =>
图像右侧 10 个像素。
e.Bounds.Height -2 =>
比 少 2 个像素item.Bounds.Height
.