日期:2014-05-16  浏览次数:20847 次

c# 调用另一个窗体中pictureBox绘图,程序无法停止
主程序调用FrmDrawing代码如下
private void button2_Click(object sender, EventArgs e)
{
    FrmDrawing fd = new FrmDrawing();
    fd.Name = "变形曲线图";
    fd.WindowState = FormWindowState.Maximized;
    fd.MaximizeBox = false;
    fd.ShowDialog(this);
}

以下为FrmDrawing窗体代码和调用pictureBox绘图代码,绘图部分省略
最后对pictureBox绘制内容保存为jpg图片
public FrmDrawing()
{
    InitializeComponent();
    this.pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    ...
}

以上代码实现我想要的绘制变形曲线的功能已无问题,但是,程序会反复的调用pictureBox1_Paint内容,一直画下去,对绘制的图也能自动保存,但FrmDrawing窗体无法顺利关闭
上述代码有几个不明白的地方(部分关键实现部分是从网上参照多次后实现的,具体原理不甚明了,小弟初学)
1:fd.ShowDialog(this);为什么非得加入this
2:this.pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);是什么意思,通过F10调试也看不明白具体调用步骤。
恳请哪位高手指点一下,网上找了好久没有答案,只有上万能的CSDN上来解惑了,这可是我的第一次发帖啊,万分感谢。
------解决方案--------------------
this.pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint); 
这个是绑定paint事件 就像是给button添加单击事件一样
------解决方案--------------------
ShowDialog(this)
在窗口A中:
FormB b=new FormB();
B.ShowDialog(this);
这样在B窗口中可以用
this.owner就可以找到窗口A,可以用来窗口间传值
------解决方案--------------------
 this.pictureBox1.Paint 
这个事件本身就是picturebox的重绘事件啊,你在上面画图了肯定会一直调用这个函数吧。。。
------解决方案--------------------
1. 调试时在VS和被调试窗口间切换,因为需要重绘窗体(除非VS界面缩小,不遮盖被调试窗体),使得窗口的Paint事件反复地触发,当然会循环运行。所以Paint事件一般不容易跟踪运行。

2. 楼主的Paint事件处理代码承担了太多不该承担的任务,包括绘图、清屏、存盘,占用资源过多。猜测楼主的Paint是要实现类似动画的效果,建议与Timer结合
------解决方案--------------------
引用:
我的程序思路是这个样子的,假如总共有30条变形曲线要画,一个picturebox画3根,画完后图片保存,然后gc.Clear(this.BackColor),清空picturebox,然后一直循环下去。但是循环到30后他又重新循环了,不明觉厉


“然后一直循环下去”是什么意思,不是画完30条重头开始循环?
paint是重绘事件,控件需要重绘的时候都会触发这个事件,比如最小化后再还原,控件被别的窗体遮挡再还原,会不会是反复触发了,所以程序一直运行呢
------解决方案--------------------
picturebox_Paint() 这个事件是一直运行下去呀。只要你的介面有刷新就会运行。
像被其他窗体档住,就会刷新。调用Inxxx那更会刷。直到你的介面控件没有变化(不被任何的东西档住)才会停。

------解决方案--------------------
gdi+理论上可以在所有可视控件上绘图,也不一定要通过paint。至于说你的程序不停刷新,应该是程序逻辑有问题