这与我之前所做的不同。
在我的组合所有者绘制的组合框中绘制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行(实线,短划线,短点)。
我在组合框中看不到任何行,除了一些蓝色是选定的颜色
谢谢你
答案 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;
}
布局事件太早了。控制尚未准备就绪。因此引发了异常。我不确定可以用什么其他事件来达到预期的效果。