C#绘图:如何将上一条线的坐标(CF)存储为下一条线的起始坐标(AF)
解决C#中保留上一次绘制坐标的问题
嘿,我懂你现在的困境啦——你在做学校的C#项目,需要把上一次绘制线条的终点坐标(CF),当成下一次画线的起点坐标(AF)对吧?看了你贴的代码片段,问题出在你把AD、BD这些坐标变量定义在按钮点击事件的局部作用域里了,每次点击按钮都会重新初始化这些变量,根本没法保留上一次的值!咱们来一步步解决这个问题:
第一步:把坐标变量移到类的成员区域
首先,你得把需要持久化的坐标变量(比如上一次的终点)定义在窗体类的成员位置,而不是方法内部。这样它们的生命周期会和窗体一致,能保留每次点击后的值。
比如在你的Form类里添加:
// 类成员变量,用来保存上一次的终点坐标 private double _lastAD = 0; private double _lastBD = 0; private int n = 0; // 假设n也是类成员,你的原代码里应该已有定义
第二步:修改按钮点击事件的逻辑
接下来调整button1_Click的逻辑,第一次点击时初始化坐标,之后的点击就用上一次保存的坐标作为新起点:
public void button1_Click(object sender, EventArgs e) { int L = Convert.ToInt32(numericUpDown1.Value); int T = Convert.ToInt32(numericUpDown2.Value); // 补全你的第二个数值控件名 if (n < 1) { // 第一次点击,初始化起点 _lastAD = 0; _lastBD = 0; n++; } else { // 从第二次点击开始,直接基于上一次的终点计算新坐标 n++; } // 绘制线条:用上一次的终点作为本次起点,计算新终点 using (var g = Graphics.FromImage(pictureBox1.Image)) { Pen drawPen = new Pen(Color.Black, 2); // 本次起点是上一次的终点,本次终点是起点偏移L和T后的位置 int currentCFx = (int)_lastAD + L; int currentCFy = (int)_lastBD + T; // 绘制线条(AF → CF) g.DrawLine(drawPen, (int)_lastAD, (int)_lastBD, currentCFx, currentCFy); // 更新成员变量,把本次终点存为下一次的起点 _lastAD = currentCFx; _lastBD = currentCFy; // 刷新PictureBox显示新绘制的内容 pictureBox1.Refresh(); } }
关键要点提醒
- 成员变量vs局部变量:局部变量每次方法调用都会重新创建,而类成员变量会在窗体生命周期内一直存在,这是保留上一次坐标的核心。
- 绘制后更新变量:每次绘制完成后,一定要把当前的终点坐标更新到成员变量里,这样下一次点击才能拿到正确的起点。
- 初始化图像:别忘了在窗体构造函数里初始化PictureBox的图像,避免空引用异常:
public YourFormName() { InitializeComponent(); // 初始化PictureBox的画布 pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); }
这样调整后,每次点击按钮绘制线条时,都会自动把上一次的终点(CF)作为下一次的起点(AF)啦!
内容的提问来源于stack exchange,提问作者Christheyankee
相关产品推荐
相关产品推荐

