FillRectangle参数无效
这是我得到的例外
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:
和代码
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);
}
最后将值传递给它:
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
您可以使用bgColourBrush
和fgColourBrush
全局变量,而不是使用每个绘图创建Brush对象,而只是改变它们的颜色。 请原谅我,如果下面的代码不是按原样编译的,我是徒手编写的。 喜欢这个:
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);
}
UPDATE
所以我看到你的pdt ListCell对象有一个bgColour
和一个fgColour
属性。 为了让我的上述解决方案起作用, bgColour
和fgColour
需要是Color
类型。 或者如果他们是类型SolidColorBrush,那么你需要这样做: bgColour.Color
和fgColour.Color
。
您应该始终处理像Brush
, SolidBrush
, Pen
这样的非托管类。 假设pdt.bgColour
和pdt.fgColour
是Color
类型,类似下面的代码应该可以防止崩溃。 警告:未经测试的代码。
if (e.Index > -1)
{
e.DrawBackground();
SolidBrush bgColourBrush = null;
SolidBrush fgColourBrush = null;
ComboBox combo = (ComboBox)sender;
objPDT.ListCell pdt = (objPDT.ListCell)combo.Items[e.Index];
try {
if (e.ForeColor == SystemColors.HighlightText)
{
bgColourBrush = new SolidBrush(e.BackColor);
fgColourBrush = new SolidBrush(e.ForeColor);
}
else if (pdt.bgColour == null)
{
bgColourBrush = new SolidBrush(Color.Black);
fgColourBrush = new SolidBrush(Color.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);
} finally {
if(bgColorBrush != null) {
bgColorBrush.Dispose();
}
if(fgColorBrush != null) {
fgColorBrush.Dispose();
}
}
}
链接地址: http://www.djcxy.com/p/16695.html
上一篇: FillRectangle Parameter is not valid
下一篇: How to mock backend interaction when running calabash tests