Combobox在选中时绘制图像

时间:2018-04-30 14:20:36

标签: c# winforms combobox drawimage

当选择项目时,我尝试从组合框中的图像列表中绘制图像。

我能够绘制图像,但是当DrawMode.OwnerDrawFixed事件结束时,我丢失了图像。

我的组合框已经有ListImage

我有一个名为ImageList的 protected override void OnSelectedIndexChanged(EventArgs e) { base.OnSelectedIndexChanged(e); if (this.SelectedIndex > -1) { var g = this.CreateGraphics(); this.ImageList.Draw(g, 0, 0, 1); } } 控件,包含10张图片。

对于我的简短示例,我只需要在我的组合框中绘制我的ImageList位置1的图像,这就是为什么我得到这个.ImageList.Draw(g,0,0, 1 );

{{1}}

可能我不赞成正确的事件。有什么建议吗?

在Draw之后的IndexChanged中看到带有断点的图片。这是工作,但我在活动结束后失去了我的形象。

enter image description here

1 个答案:

答案 0 :(得分:3)

ComboBox DrawMode更改为OwnerDrawVariable 使用DrawItem事件从ComboBox项目Bounds中的源(图像列表,在本例中)中绘制图像。

如果ComboBox DropDownStyle设置为DropDownList,则图片将显示在选择框中;如果设置为DropDown,则仅绘制文本。

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index > -1)
    {
        e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        using (Brush backgbrush = new SolidBrush(comboBox1.BackColor))
            e.Graphics.FillRectangle(backgbrush, e.Bounds);

        using (Brush textbrush = new SolidBrush(comboBox1.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)));
        e.DrawFocusRectangle();
    }
}

此处的幻数10, -2)只是偏移:
e.Bounds.Height + 10 =>图片右侧10个像素 e.Bounds.Height -2 =>item.Bounds.Height小2个像素。

ComboBox OwnerDrawVariable