Invalid FillRectangle parameter

This is the exception I get

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: 

And code

 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); } 

And finally, the values ​​are passed to him:

 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 
+7
c # drawing
source share
2 answers

Instead of creating Brush objects with every draw, perhaps you can make the global variables bgColourBrush and fgColourBrush , and then just change their color. Please forgive me if the code below does not compile as is, I did it by hand. Like this:

 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

So, I see that your pdt ListCell object has the bgColour and fgColour . In order for my solution to be higher, bgColour and fgColour must be of type Color . Or, if they are a type of SolidColorBrush, you need to do this: bgColour.Color and fgColour.Color .

+1
source share

You should always dispose of unmanaged classes such as Brush , SolidBrush , Pen . Assuming pdt.bgColour and pdt.fgColour are of type Color , something like the following code should prevent this from crashing. Warning: unverified code.

 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(); } } } 
+2
source share

All Articles