none
有没有可能保留 Paint 事件中的 e.Graphics 的属性? RRS feed

  • 问题

  • 比如所每次处理 Paint 事件,我都需要设定 e.Graphics 的 SmoothingMode 属性,我能否只设定一次,然后以后的重绘都不需要再次设定这个属性,除非我手动改变?

    EFanZh

    2012年6月4日 7:05

答案

全部回复

  • 您好:)

    我建议:

    1)你定义一个Graphics类全局变量和一个全局类变量(布尔,用于判断是否赋值了)

    public class Form1:Form
    {
      ………………
      private Graphics g = null;
    private bool flag = false; //尚未对g赋值 }

    2)然后处理窗体的Paint事件:

    private void Form1_Paint(……) { if(!flag) { g = e.Graphics; g.SmoothingMode = xxx;
    flag = true;

    } //这里做你做的东西,使用g即可。 }

    这样的话,由于g是全局的,那么你随时随地都可以改变属性。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月5日 2:13
    版主
  • 这样貌似是不行的,g 中保留的是第一次 Paint 事件的 Graphics 对象,而在第一次 Paint 事件完成后此 Graphics 对象貌似已经无效了。我尝试了一下,结果画出来的是大红叉。

    EFanZh


    • 已编辑 EFanZh 2012年6月5日 3:09
    2012年6月5日 2:37
  • 这样貌似是不行的,g 中保留的是第一次 Paint 事件的 Graphics 对象,而在第一次 Paint 事件完成后此 Graphics 对象貌似已经无效了。我尝试里一下,结果画出来的是大红叉。

    EFanZh

    我修正了代码,请看:

    public partial class Form1 : Form
        {
            private Graphics g = null;
            private bool flag = false;
            
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
               
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                if (!flag)
                {
                    g = this.CreateGraphics();
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    flag = true;
                }
                g.DrawString("ss", SystemFonts.DefaultFont, Brushes.Black, new PointF(0, 0));
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                g.DrawString("ss", SystemFonts.DefaultFont, Brushes.Black, new PointF(0, 10));
            }
        }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月5日 2:42
    版主
  • 不过这个就基本上没 Paint 事件什么事了,因为 Paint 事件所提供的 e.Graphics 包含了所需的重绘区域(无效区域),同时在绘制之前,由于是无效区域,区域会首先按背景色被擦除,然后重新绘制。而这个方法基本上不管无效区域,而且直接在已绘制的区域上面直接绘制,这对于有 Alpha 通道的图像,在多次重绘后会得到不同的结果。就按照这个例子,多次单击窗体后会发现文字效果变得惨不忍睹。


    EFanZh

    2012年6月5日 3:19
  • 建议您先擦除之后再绘制。同时正如您所言,Paint方法的确一旦脱离Paint事件不起作用,所以您要不每次重设,要不就像我一样绘制。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 EFanZh 2012年6月5日 4:06
    2012年6月5日 3:38
    版主