C#组合框用线条

时间:2012-06-05 03:32:27

标签: c# winforms

这与我之前所做的不同。

在我的组合所有者绘制的组合框中绘制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行(实线,短划线,短点)。

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

谢谢你

2 个答案:

答案 0 :(得分: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;


        }
    }
}

答案 1 :(得分:1)

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

所以我不得不用黑客来修复它。

我在最初显示表单后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;
}

布局事件太早了。控制尚未准备就绪。因此引发了异常。我不确定可以用什么其他事件来达到预期的效果。