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 个像素