ComboBox 在所选项目上绘制图像
ComboBox draw image on selected item
我尝试在选择项目时从组合框中的图像列表中绘制图像。
我可以画图,但是当 onSelctedIndexChanged
活动结束时,我的图丢失了。
我的 ComboBox 已经有 DrawMode.OwnerDrawFixed
.
我有一个名为 ImageList 的 ListImage
控件,其中包含 10 张图片。
对于我的简短示例,我只需要在我的 ComboBox 中绘制图像列表位置 1 的图像,这就是我得到 this.ImageList.Draw(g, 0, 0, **1**);
的原因
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
if (this.SelectedIndex > -1)
{
var g = this.CreateGraphics();
this.ImageList.Draw(g, 0, 0, 1);
}
}
可能我没有订阅正确的活动。有什么建议吗?
见下图,画好后在SelectedIndexChanged
断点。效果不错,但活动过后我的形象就没了。
将组合框 DrawMode 更改为 OwnerDrawVariable
。
使用 DrawItem 事件从 ComboBox 项 Bounds 内的来源(在本例中为 ImageList)绘制图像。
如果ComboBoxDropDownStyle设置为DropDownList
,图像将显示在选择框中;如果设置为 DropDown
,则只绘制文本。
这里,焦点矩形仅在鼠标悬停在ListControl的项目上时绘制,而在选择项目时不使用,由以下因素决定:
(e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit))
.
// These could be properties used to customize the ComboBox appearance
Color cboForeColor = Color.Black;
Color cboBackColor = Color.WhiteSmoke;
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0) return;
Color foreColor = e.ForeColor;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
if (e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit)) {
e.DrawBackground();
e.DrawFocusRectangle();
}
else {
using (Brush backgbrush = new SolidBrush(cboBackColor)) {
e.Graphics.FillRectangle(backgbrush, e.Bounds);
foreColor = cboForeColor;
}
}
using (Brush textbrush = new SolidBrush(foreColor)) {
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(),
e.Font, textbrush, e.Bounds.Height + 10, e.Bounds.Y,
StringFormat.GenericTypographic);
}
e.Graphics.DrawImage(this.imageList1.Images[e.Index],
new Rectangle(e.Bounds.Location,
new Size(e.Bounds.Height - 2, e.Bounds.Height - 2)));
}
此处的 幻数 (10, -2
) 只是偏移量:
e.Bounds.Height + 10 =>
图像右侧 10 个像素。
e.Bounds.Height -2 =>
比 item.Bounds.Height
.
少 2 个像素
我尝试在选择项目时从组合框中的图像列表中绘制图像。
我可以画图,但是当 onSelctedIndexChanged
活动结束时,我的图丢失了。
我的 ComboBox 已经有 DrawMode.OwnerDrawFixed
.
我有一个名为 ImageList 的 ListImage
控件,其中包含 10 张图片。
对于我的简短示例,我只需要在我的 ComboBox 中绘制图像列表位置 1 的图像,这就是我得到 this.ImageList.Draw(g, 0, 0, **1**);
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
if (this.SelectedIndex > -1)
{
var g = this.CreateGraphics();
this.ImageList.Draw(g, 0, 0, 1);
}
}
可能我没有订阅正确的活动。有什么建议吗?
见下图,画好后在SelectedIndexChanged
断点。效果不错,但活动过后我的形象就没了。
将组合框 DrawMode 更改为 OwnerDrawVariable
。
使用 DrawItem 事件从 ComboBox 项 Bounds 内的来源(在本例中为 ImageList)绘制图像。
如果ComboBoxDropDownStyle设置为DropDownList
,图像将显示在选择框中;如果设置为 DropDown
,则只绘制文本。
这里,焦点矩形仅在鼠标悬停在ListControl的项目上时绘制,而在选择项目时不使用,由以下因素决定:
(e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit))
.
// These could be properties used to customize the ComboBox appearance
Color cboForeColor = Color.Black;
Color cboBackColor = Color.WhiteSmoke;
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0) return;
Color foreColor = e.ForeColor;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
if (e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit)) {
e.DrawBackground();
e.DrawFocusRectangle();
}
else {
using (Brush backgbrush = new SolidBrush(cboBackColor)) {
e.Graphics.FillRectangle(backgbrush, e.Bounds);
foreColor = cboForeColor;
}
}
using (Brush textbrush = new SolidBrush(foreColor)) {
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(),
e.Font, textbrush, e.Bounds.Height + 10, e.Bounds.Y,
StringFormat.GenericTypographic);
}
e.Graphics.DrawImage(this.imageList1.Images[e.Index],
new Rectangle(e.Bounds.Location,
new Size(e.Bounds.Height - 2, e.Bounds.Height - 2)));
}
此处的 幻数 (10, -2
) 只是偏移量:
e.Bounds.Height + 10 =>
图像右侧 10 个像素。
e.Bounds.Height -2 =>
比 item.Bounds.Height
.