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
相关产品推荐
相关产品推荐

