这是我得到的例外
System.ArgumentException was unhandled
HResult=-2147024809
Message=Parameter is not valid.
Source=System.Drawing
StackTrace:
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.FillRectangle(Brush brush, Int32 x, Int32 y, Int32 width, Int32 height)
at System.Drawing.Graphics.FillRectangle(Brush brush, Rectangle rect)
at frmMain.drawCboxItem(Object sender, DrawItemEventArgs e) in frmMain.cs:line 465
at frmMain.cboxSectionCell_DrawItem(Object sender, DrawItemEventArgs e) in frmMain.cs:line 485
at System.Windows.Forms.ComboBox.OnDrawItem(DrawItemEventArgs e)
at System.Windows.Forms.ComboBox.WmReflectDrawItem(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmOwnerDraw(Message& m)
at System.Windows.Forms.Control.WmDrawItem(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmOwnerDraw(Message& m)
at System.Windows.Forms.Control.WmDrawItem(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:
Run Code Online (Sandbox Code Playgroud)
和代码
if (e.Index > -1)
{
e.DrawBackground();
Brush bgColourBrush = null;
Brush fgColourBrush = null;
ComboBox combo = (ComboBox)sender;
objPDT.ListCell pdt = (objPDT.ListCell)combo.Items[e.Index];
if (e.ForeColor == SystemColors.HighlightText)
{
bgColourBrush = new SolidBrush(e.BackColor);
fgColourBrush = new SolidBrush(e.ForeColor);
}
else if (pdt.bgColour == null)
{
bgColourBrush = Brushes.Black;
fgColourBrush = Brushes.White;
}
else
{
bgColourBrush = pdt.bgColour;
fgColourBrush = pdt.fgColour;
}
// background
e.Graphics.FillRectangle(bgColourBrush, e.Bounds);
//foreground
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawString(pdt.Name, combo.Font, fgColourBrush, e.Bounds.X, e.Bounds.Y);
}
Run Code Online (Sandbox Code Playgroud)
最后传递给它的值:
pdt {
Section 8--> CELL} objPDT.ListCell
_bgcolour {Color = {Color [A=255, R=166, G=166, B=166]}} System.Drawing.Brush {System.Drawing.SolidBrush}
_CellID 27 int
_fgcolour {Color = {Color [A=255, R=255, G=255, B=255]}} System.Drawing.Brush {System.Drawing.SolidBrush}
_name "Section 8--> CELL" string
_SectionID 8 int
bgColour {Color = {Color [A=255, R=166, G=166, B=166]}} System.Drawing.Brush {System.Drawing.SolidBrush}
fgColour {Color = {Color [A=255, R=255, G=255, B=255]}} System.Drawing.Brush {System.Drawing.SolidBrush}
Name "Section 8--> CELL" string
Value "8:27" string
}
e.Bounds {X = 0 Y = 30 Width = 290 Height = 15} System.Drawing.Rectangle
Bottom 45 int
Height 15 int
IsEmpty false bool
Left 0 int
Location {X = 0 Y = 30} System.Drawing.Point
Right 290 int
Size {Width = 290 Height = 15} System.Drawing.Size
Top 30 int
Width 290 int
X 0 int
Y 30 int
Run Code Online (Sandbox Code Playgroud)
也许您可以创建全局变量,然后只更改它们的颜色,而不是在每次绘制时创建 BrushbgColourBrush对象fgColourBrush。如果下面的代码不能按原样编译,请原谅我,我是徒手完成的。像这样:
if (e.Index > -1)
{
e.DrawBackground();
ComboBox combo = (ComboBox)sender;
objPDT.ListCell pdt = (objPDT.ListCell)combo.Items[e.Index];
if (e.ForeColor == SystemColors.HighlightText)
{
this.bgColourBrush.Color = e.BackColor;
this.fgColourBrush.Color = e.ForeColor;
}
else if (pdt.bgColour == null)
{
this.bgColourBrush.Color = Brushes.Black.Color;
this.fgColourBrush.Color = Brushes.White.Color;
}
else
{
this.bgColourBrush.Color = pdt.bgColour;
this.fgColourBrush.Color = pdt.fgColour;
}
// background
e.Graphics.FillRectangle(bgColourBrush, e.Bounds);
//foreground
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawString(pdt.Name, combo.Font, fgColourBrush, e.Bounds.X, e.Bounds.Y);
}
Run Code Online (Sandbox Code Playgroud)
所以我看到你的 pdt ListCell 对象有一个bgColour和 一个fgColour属性。为了使我的上述解决方案发挥作用,bgColour并且fgColour需要为Color. 或者,如果它们是 SolidColorBrush 类型,那么您需要执行以下操作:bgColour.Color和fgColour.Color。
| 归档时间: |
|
| 查看次数: |
2885 次 |
| 最近记录: |