DrawRectangle不显示的主因是Graphics对象未绑定到有效设备上下文,必须在Paint事件中使用e.Graphics;Pen参数错误、坐标尺寸传反或混淆FillRectangle与DrawRectangle语义也会导致失效。

Graphics.DrawRectangle 画出来的矩形不显示?检查 Graphics 对象来源
直接调用 Graphics.DrawRectangle 却看不到矩形,大概率是 Graphics 实例没绑定到可呈现的设备上下文。它不是“画完就留在窗体上”的傻瓜式绘图,而是依赖当前绘图表面的生命周期。
- 在 WinForms 中,**只能在
Paint事件里用e.Graphics** —— 其他地方(比如按钮点击里)拿到的Graphics是临时的、不关联控件重绘机制的,画了也白画 - 如果非要响应式绘制(如鼠标拖拽画矩形),得把矩形坐标存下来,在
Paint事件里重绘;不能靠“缓存 Graphics” - 用
Control.CreateGraphics()获取的Graphics会立刻被系统擦除(比如窗口最小化再恢复),仅适合临时调试,切勿用于正式逻辑
Pen 参数决定矩形边框是否可见、多粗、什么颜色
DrawRectangle 第二个参数必须是 Pen,不是 Brush,这点容易和 FillRectangle 混淆。漏传、传错类型或 Pen.Width 设为 0,都会导致“画了但看不见”。
-
Pen构造函数第一个参数是Color,第二个是宽度(单位像素),例如:new Pen(Color.Red, 2f) - 宽度设为
0f时,GDI+ 会强制按 1 像素渲染,但某些缩放 DPI 下可能被压成不可见,建议显式设为1f或更高 - 别用
Pen.DashStyle却忘了设DashPattern,否则默认实线;虚线需配对设置:pen.DashStyle = DashStyle.Custom; pen.DashPattern = new float[] { 2, 2 };
坐标和尺寸传反了?Rectangle 构造顺序是 X,Y,Width,Height
传给 DrawRectangle 的 Rectangle 或四个独立参数,顺序固定为左上角 X、Y,再加宽、高。很多人按“起点+终点”思维误传成 X1,Y1,X2,Y2,结果矩形飞走或尺寸为负,直接不渲染。
- 正确写法:
g.DrawRectangle(pen, 10, 20, 100, 50)表示从 (10,20) 开始,向右 100px、向下 50px 的矩形 - 若你有鼠标按下/抬起点
startPoint和endPoint,要算出合法矩形:先取 min/max 得左上角,再算宽高:int x = Math.Min(startPoint.X, endPoint.X); int y = Math.Min(startPoint.Y, endPoint.Y); int w = Math.Abs(endPoint.X - startPoint.X); int h = Math.Abs(endPoint.Y - startPoint.Y); - 注意:WinForms 默认坐标系 Y 向下增长,和数学坐标系一致,但和某些图像库相反,别下意识翻转 Y
想填满矩形?别用 DrawRectangle,改用 FillRectangle + SolidBrush
DrawRectangle 只画边框,哪怕你传了 Brush 它也不认——编译都过不去。填色必须换函数、换参数类型。
- 填纯色:用
Graphics.FillRectangle(SolidBrush, Rectangle),SolidBrush构造参数是Color,例如:using (var brush = new SolidBrush(Color.LightBlue)) { g.FillRectangle(brush, rect); } - 边框+填充一起画:先
FillRectangle,再DrawRectangle,顺序不能反,否则边框可能被抗锯齿模糊掉边缘 - 性能提示:频繁创建
SolidBrush有开销,长期使用的颜色建议提成类字段复用;但Pen同理,别在Paint里反复 new,尤其带透明色的Pen(Alpha 混合更耗)
真正麻烦的不是语法,是坐标来源是否稳定、Graphics 生命周期是否可控、以及 Fill/Draw 语义是否混淆。这三个点卡住,代码写得再全也没用。


















