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

C# Graphics绘图问题:自定义Canvas类绘制线条在PictureBox无显示如何解决

问题修复方案

核心问题1:DrawSquare方法参数错误

Graphics.DrawRectangle 方法的后两个参数要求为矩形的宽度、高度,而非右下角坐标。你当前代码传入xPos + width、yPos + width相当于把矩形宽度设置为xPos+width,会导致矩形尺寸远超预期,甚至超出Bitmap的显示区域,自然看不到图形。
修复后的DrawSquare方法如下:

public void DrawSquare(int width)
{
    // 后两个参数改为宽度、高度,而非终点坐标
    g.DrawRectangle(Pen, xPos, yPos, width, width);
}

核心问题2:重绘逻辑优化

你当前调用的Refresh()是刷新整个窗体,建议直接刷新PictureBox控件即可,减少不必要的重绘开销,也能避免部分场景下重绘生效延迟的问题。
修改commandLine_KeyDown方法里的重绘逻辑:

// 把原来的 Refresh(); 替换为下面的代码
PictureBox1.Refresh();
// 可选:禁止输入框回车默认行为,避免产生多余的提示音和空字符
e.SuppressKeyPress = true;

可选优化

1. 确保绘图操作立即提交

GDI+的绘图操作存在缓冲机制,你可以在绘图方法末尾增加Flush调用,确保绘图内容立即写入Bitmap:

public void DrawLine(int toX, int toY)
{
    g.DrawLine(Pen, xPos, yPos, toX, toY);
    xPos = toX;
    yPos = toY;
    g.Flush();
}

public void DrawSquare(int width)
{
    g.DrawRectangle(Pen, xPos, yPos, width, width);
    g.Flush();
}

2. 简化Bitmap绑定逻辑

你可以直接在Form构造函数里把OutputBitmap绑定到PictureBox的Image属性,就不用自己实现Paint事件,减少出错概率:

public Form1()
{
    InitializeComponent();
    MyCanvass = new Canvass(Graphics.FromImage(OutputBitmap));
    // 新增下面这行,直接绑定Bitmap到PictureBox,不需要额外处理Paint事件
    PictureBox1.Image = OutputBitmap;
}

修改完成后重新运行程序,输入line即可看到从(0,0)到(160,120)的红色线段,输入square会以上一次线段终点为左上角绘制25*25的红色正方形。


内容的提问来源于stack exchange,提问作者stratton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:24:04