WinForm绘制居中十字准星出错:竖线扭曲偏移问题排查(.NET 4.7.2)
问题原因与修复方案
核心错误:坐标参数颠倒
你代码里的竖线终点坐标完全搞反了:
原代码中竖线底部点写的是 Point(size.Height - 1, halfWidth),这里把X、Y坐标的位置弄混了。竖线的X轴应该始终保持为中心的halfWidth,Y轴才是窗体底部的size.Height - 1,这是导致竖线扭曲偏移的直接原因。
额外优化点
- 用ClientSize替代Size:
Size包含窗体边框和标题栏,ClientSize才是用户可见的可绘制区域,用它计算才能让准星真正处于操作区域中心。 - 释放GDI+资源:
Pen属于GDI+资源,必须手动释放,用using语句可以自动完成,避免内存泄漏。 - 简化坐标计算:WinForm坐标是整数类型,直接用
clientSize.Width / 2即可,不需要转double再转int。
修复后的完整代码
public partial class Form1 : Form { public Form1() { InitializeComponent(); ResizeRedraw = true; } private void DrawCrosshair(Graphics g, Size clientSize) { using (Pen pen = new Pen(Color.Black, 2)) { int halfWidth = clientSize.Width / 2; int halfHeight = clientSize.Height / 2; // 水平线:左右边缘连线,Y轴为中心高度 Point left = new Point(0, halfHeight); Point right = new Point(clientSize.Width - 1, halfHeight); // 竖直线:上下边缘连线,X轴为中心宽度 Point top = new Point(halfWidth, 0); Point bottom = new Point(halfWidth, clientSize.Height - 1); g.DrawLine(pen, left, right); g.DrawLine(pen, top, bottom); } } private void Form1_Paint(object sender, PaintEventArgs e) { DrawCrosshair(e.Graphics, ClientSize); } }
验证效果
- 修复竖线坐标后,竖线会垂直贯穿客户区中心
- 使用
ClientSize后,即使窗体带有边框,准星也会落在用户实际操作区域的中心 using语句确保每次绘制完成后自动释放Pen资源,避免长期运行的资源占用问题
内容的提问来源于stack exchange,提问作者Pete Hilde
相关产品推荐
相关产品推荐

