本帖最后由 bdmh 于 2014-10-14 12:47:55 编辑

解决方案 »

  1.   

    你要在OnPaint方法或Paint事件之外对某个控件绘制,只能使用 对象.CreatGraphics() 获取的graphics对象画了。
    按照面向对象编程的话,那么PictureBox的绘制应该在PictureBox内部最合理
    我建议你将画的动作写在PictureBox的OnPaint()方法内,定义一个属性存储画图的数据(变量,如矩形长宽X,Y等),然后需要绘制时,外部先赋值该属性,然后调用PictureBox的Invalidate()重绘
      

  2.   


       public partial class Form1 : Form
        {
      static public Graphics lg;        protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                lg = e.Graphics;
             }       public void test()
           {
           lg.DrawLine(ipen, point1,point2);//错误提示参数无效 Parameter is not valid.
            }}
    1,我是这样传的,但不行,
    2,pictureBox只有 pictureBox1_Paint,没有OnPaint,但是我想在pictureBox1上作图呀!
      

  3.   

    你这样使用e.Graphics是毫无意义的,这个graphics对象在OnPaint方法执行完毕后则被销毁了。所以你把他赋值给成员变量是没有用的。另外这个不叫全局,这是成员变量。封装、继承 LZ你没搞清楚啊,最好再多去琢磨下
        class MyPictureBox:PictureBox
        {
            public Rectangle Rect { get; set; }
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.Red,1);
                g.DrawRectangle(p,Rect);
                p.Dispose();
            }
        }
      

  4.   

    你可以作样 ,重构一个函数,将画布作为参数draw(graphics g)
      

  5.   

    1,成员说成全局我是说错了,
    2,函数结束e.Graphics销毁我也知道,
    3,问题来了,也就是说我在外面无法作图了呢?
      

  6.   

    再说一次,你所谓的外面,只需要处理好要绘图的数据,然后调用绘图控件的invalidate,onpaint中根据组织好的数据区绘图
      

  7.   

    这个方法我知道,也确定能用,我还想知道有没有可以将画图作为其它类的一个成员方法,可以,只是必须把Graphics当作参数传进去。Graphics只在一次重绘过程中有效,保存成全局变量没有意义。
      

  8.   

    调用控件的invalidate()方法,让其重绘就自动执行Paint事件里面的代码了
      

  9.   

    这个方法我知道,也确定能用,我还想知道有没有可以将画图作为其它类的一个成员方法,可以,只是必须把Graphics当作参数传进去。Graphics只在一次重绘过程中有效,保存成全局变量没有意义。把Graphics当作参数传进去,是什么意思?可不可以详细点呢?
      

  10.   


    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
      PaintSomething(e.Graphics);   // 把Graphics参数传到画图的方法里
    }// 这是具体画图的方法,可以在同一个类里,也可以在其它类或DLL里。
    private void PaintSomething(Graphics g)
    {
       // 在这里画图
    }