Graphics作图重绘

takpod 2014-10-14 12:29:24
定义全局 public g = pictureBox1.CreateGraphics();//在pictureBox1上作图

然后可以在外部类
Form1.g.DrawLine(Form1.pen, point1, point2);//直线画图
但此方法无在 OnPaint 或p ictureBox1_Paint中重画,(最小化后最大化无图,遮挡后,图形残缺等问题)

如果将上面g换为
g = this.CreateGraphics();//在form1上作图

问题决,但我需要在pictureBox1上作图(因为有时候 我要调整pictureBox1在form1上的位置和大小)


有人说用控件的绘图用OnPaint或者Paint事件中的Graphics作图,但这我好像无法在别的类动态地作图了,因为外部函数用不了这个Graphics

1,请问如何其它函数时作图,然后在OnPaint 中能重画?
2,我的代码都写了那么多,有办法救吗?
...全文
292 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
effun 2014-10-15
  • 打赏
  • 举报
回复

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  PaintSomething(e.Graphics);   // 把Graphics参数传到画图的方法里
}

// 这是具体画图的方法,可以在同一个类里,也可以在其它类或DLL里。
private void PaintSomething(Graphics g)
{
   // 在这里画图
}
takpod 2014-10-15
  • 打赏
  • 举报
回复
引用 9 楼 effun 的回复:
[quote=引用 8 楼 takpod 的回复:] [quote=引用 7 楼 bdmh 的回复:] 再说一次,你所谓的外面,只需要处理好要绘图的数据,然后调用绘图控件的invalidate,onpaint中根据组织好的数据区绘图
这个方法我知道,也确定能用, 我还想知道有没有可以将画图作为其它类的一个成员方法,[/quote] 可以,只是必须把Graphics当作参数传进去。Graphics只在一次重绘过程中有效,保存成全局变量没有意义。[/quote] 把Graphics当作参数传进去,是什么意思?可不可以详细点呢?
zzyhost 2014-10-15
  • 打赏
  • 举报
回复
调用控件的invalidate()方法,让其重绘就自动执行Paint事件里面的代码了
takpod 2014-10-15
  • 打赏
  • 举报
回复
引用 12 楼 effun 的回复:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  PaintSomething(e.Graphics);   // 把Graphics参数传到画图的方法里
}

// 这是具体画图的方法,可以在同一个类里,也可以在其它类或DLL里。
private void PaintSomething(Graphics g)
{
   // 在这里画图
}
这和在里没作图没有区别吧~ 好吧~谢谢
bdmh 2014-10-14
  • 打赏
  • 举报
回复
就用Onpaint中的e.Graphic画图,外部不需要调用这个,在onpaint中把graphic传出去是可以的,外部设置好绘图数据,调用picture的invalidate,重绘
effun 2014-10-14
  • 打赏
  • 举报
回复
引用 8 楼 takpod 的回复:
[quote=引用 7 楼 bdmh 的回复:] 再说一次,你所谓的外面,只需要处理好要绘图的数据,然后调用绘图控件的invalidate,onpaint中根据组织好的数据区绘图
这个方法我知道,也确定能用, 我还想知道有没有可以将画图作为其它类的一个成员方法,[/quote] 可以,只是必须把Graphics当作参数传进去。Graphics只在一次重绘过程中有效,保存成全局变量没有意义。
takpod 2014-10-14
  • 打赏
  • 举报
回复
引用 7 楼 bdmh 的回复:
再说一次,你所谓的外面,只需要处理好要绘图的数据,然后调用绘图控件的invalidate,onpaint中根据组织好的数据区绘图
这个方法我知道,也确定能用, 我还想知道有没有可以将画图作为其它类的一个成员方法,
bdmh 2014-10-14
  • 打赏
  • 举报
回复
再说一次,你所谓的外面,只需要处理好要绘图的数据,然后调用绘图控件的invalidate,onpaint中根据组织好的数据区绘图
takpod 2014-10-14
  • 打赏
  • 举报
回复
引用 4 楼 finemi 的回复:
你这样使用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();
        }
    }
1,成员说成全局我是说错了, 2,函数结束e.Graphics销毁我也知道, 3,问题来了,也就是说我在外面无法作图了呢?
feixuyue 2014-10-14
  • 打赏
  • 举报
回复
你可以作样 ,重构一个函数,将画布作为参数draw(graphics g)
finemi 2014-10-14
  • 打赏
  • 举报
回复
你这样使用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();
        }
    }
takpod 2014-10-14
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
就用Onpaint中的e.Graphic画图,外部不需要调用这个,在onpaint中把graphic传出去是可以的,外部设置好绘图数据,调用picture的invalidate,重绘
   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上作图呀!
finemi 2014-10-14
  • 打赏
  • 举报
回复
你要在OnPaint方法或Paint事件之外对某个控件绘制,只能使用 对象.CreatGraphics() 获取的graphics对象画了。 按照面向对象编程的话,那么PictureBox的绘制应该在PictureBox内部最合理 我建议你将画的动作写在PictureBox的OnPaint()方法内,定义一个属性存储画图的数据(变量,如矩形长宽X,Y等),然后需要绘制时,外部先赋值该属性,然后调用PictureBox的Invalidate()重绘

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧