2

这是与我之前所做的不同的方法。

在我的组合所有者绘制的组合框中,绘制 3 条线(实线、虚线、虚线)以使用从较早的 colpr 选择器下拉列表中选择的颜色进行绘制

this.DrawMode = DrawMode.OwnerDrawVariable;
            this.DropDownStyle = ComboBoxStyle.DropDownList;
     protected override void OnDrawItem(DrawItemEventArgs e)
        {
            e.DrawBackground();  
            int startX = e.Bounds.Left + 5;
            int startY = (e.Bounds.Y);
            Point p1=new Point(startX,startY);
            int endX = e.Bounds.Right - 5;
            int endY = (e.Bounds.Y);
             ComboBoxItem item = (ComboBoxItem)this.Items[e.Index];
            Point p2=new Point(endX,endY);
            base.OnDrawItem(e);
            Pen SolidmyPen = new Pen(item.foreColor, 1);
            Pen DashedPen = new Pen(item.foreColor, 1);
            DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            Pen DashDot = new Pen(item.foreColor, 1);
            DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
           // Pen DashedPen = new Pen(item.foreColor, (Int32)this.Items[e.Index]);

            Bitmap myBitmap = new Bitmap(item.Picture);
            Graphics graphicsObj;
            graphicsObj = Graphics.FromImage(myBitmap);
            switch (e.Index)
            {
                case 0:
                    graphicsObj.DrawLine(SolidmyPen, p1, p2);
                    break;
                case 1:
                    graphicsObj.DrawLine(DashedPen, p1, p2);
                    break;
                case 2:
                    graphicsObj.DrawLine(DashDot, p1, p2);
                    break;


            }

这就是我想要做的。在组合框中绘制 3 条线(实线、虚线、虚线)。

我在组合框中看不到任何线条,除了一些蓝色是选定的颜色

感谢你

4

2 回答 2

2

尝试这个。

我启动了一个新的 winforms 应用程序。创建了一个基于 ComboBox 的类,添加了您的代码并对其进行了一些修改。我认为您的主要问题在于您的位图部分。您创建一个新位图,然后在其上绘制,但您从不使用您创建的位图。如果您希望保留您创建的代码,您必须添加到方法 item.Picture=myBitmap 的末尾。但我认为这会再次调用 ondrawitem 并且您将处于无限循环中。无需根据 item.Picture 创建图形对象,只需使用在 DrawItemEventArgs 中为您创建的图形对象。

e.Graphics

这就是我所做的,我想我清理了一下。您可能已经知道,但您应该始终使用 {..} 将钢笔、画笔和图形包裹起来,就像我在下面演示的那样。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
    this.DrawMode = DrawMode.OwnerDrawVariable;
        this.DropDownStyle = ComboBoxStyle.DropDownList;
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        e.DrawBackground();
        //I removed you int startX... endy... stuff, unless you want to keep it for readability there is no need
        Point p1 = new Point(e.Bounds.Left + 5, e.Bounds.Y + 5);
        Point p2 = new Point(e.Bounds.Right - 5, e.Bounds.Y + 5);

        //I am not sure why you would want to call the base.OnDrawItem, feel free to uncomment it if you wish though
        //base.OnDrawItem(e);

        switch (e.Index)
        {
            case 0:
                using ( Pen SolidmyPen = new Pen(e.ForeColor, 1))
                e.Graphics.DrawLine(SolidmyPen, p1, p2);
                break;
            case 1:
                using (Pen DashedPen = new Pen(e.ForeColor, 1))
                {
                    DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                    e.Graphics.DrawLine(DashedPen, p1, p2);
                }
                break;
            case 2:
                using (Pen DashDot = new Pen(e.ForeColor, 1))
                {
                    DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                    e.Graphics.DrawLine(DashDot, p1, p2);
                }
                break;


        }
    }
}
于 2012-06-05T11:26:09.093 回答
1

我使用类似的方法来绘制一个组合框。但是 GDI+ 不断抛出异常。这适用于 Windows XP,但不适用于 Windows 7。

所以我不得不用一个hack来修复它。

我添加了一个计时器来触发一个事件,在表单最初显示 100 毫秒后。此事件显示组合框列表中的第一项。

private void timer1_Tick(object sender, EventArgs e)
{
    // Use a short 100 ms delay before showing the default items 
    // in the dropdown lists
    predefinedComboBox.SelectedIndex = 0;

    // Disable the timer
    timer1.Enabled = false;
}

布局事件为时过早。控件尚未准备好绘制。所以抛出了异常。我不确定可以使用哪些其他事件来达到预期的效果。

于 2012-09-27T18:24:04.313 回答