You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm绘制居中十字准星出错:竖线扭曲偏移问题排查(.NET 4.7.2)

问题原因与修复方案

核心错误:坐标参数颠倒

你代码里的竖线终点坐标完全搞反了:
原代码中竖线底部点写的是 Point(size.Height - 1, halfWidth),这里把X、Y坐标的位置弄混了。竖线的X轴应该始终保持为中心的halfWidth,Y轴才是窗体底部的size.Height - 1,这是导致竖线扭曲偏移的直接原因。

额外优化点

  1. 用ClientSize替代Size:Size包含窗体边框和标题栏,ClientSize才是用户可见的可绘制区域,用它计算才能让准星真正处于操作区域中心。
  2. 释放GDI+资源:Pen属于GDI+资源,必须手动释放,用using语句可以自动完成,避免内存泄漏。
  3. 简化坐标计算: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:58:11