none
[困惑]有关c#中重绘的问题 RRS feed

  • 问题

  • 有某窗口Form1,包含一个Button1

    部分伪代码如下:

     

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      e.Graphics.DRAW("Hello world!");//DRAW为伪代码 
     } 
      
      
     private void button1_Click(object sender, EventArgs e) 
     { 
      using (Graphics g = Graphics.FromHwnd(this.Handle)) 
      { 
       g.Clear(Color.White); 
       g.DRAW("Btn1Click"); //DRAW为伪代码 
      } 
      
     } 
    

     

    在界面刚显示的时候,屏幕上确实如实地出现了“Hello World",

    点击btn1之后,屏幕如期显示白底黑字的"Btn1Click"。

    这之后,当Form被其他窗口覆盖,再将覆盖窗口移开之后,会如期地产生重绘事件(设断点可以捕获到 e.Graphics.DRAW( "Hello world!" ); ),但是却不会将"Hello World"画于窗口之上。(虽然这是好事,但我却想知道这是为什么

    只有将Form最小化再最大化 或 移将Form移出屏幕边界再移回 才会正常地显示出"Hello World"

     

    初步怀疑是e.Graphics不同,但具体细节却想不明白,翻查一下Windows程序设计/MSDN也都找不到答案。

    所以特来请教,为什么当窗体被覆盖并且当覆盖物被移开之后产生的重绘事件( Form1_Paint(...) )不能如期地将"Hello World!"画在界面上?

     


    2011年7月18日 16:28

答案

  • dear

    重会事件触发相当繁琐,任一控件的改变都会触发,设中断没用,很可能会被其他事件覆盖

    你可搭配Activated、Paint事件来处理

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
      using (Graphics g = e.Graphics)
      {
        g.Clear(Color.White);
        g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    private void Form1_Activated(object sender, EventArgs e)
    {
      RePaint();
    }
    
    void RePaint()
    {
      using (Graphics g = Graphics.FromHwnd(this.Handle))
      {
        g.Clear(Color.White);
        g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
      using (Graphics g = Graphics.FromHwnd(this.Handle))
      {
        g.Clear(Color.White);
        g.DrawString("Test1", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    
    



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月19日 6:36
  • Hi~

    你可以參考余小章的程式碼~

    剛才我有實作了一下~

    針對你的

    private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
     e.Graphics.DRAW("Hello world!");//DRAW为伪代码  
    
    }

    這部份有些問題~
    如同余小章的此段 Code

     private void Form1_Paint(object sender, PaintEventArgs e)

    {
     using (Graphics g = e.Graphics)
     {
      g.Clear(Color.White);
      g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
     }
    

    試試改成這樣~  或許你就不會出現你的問題了~~~
    當然,余小章說的搭配 Activated 事件 是個非常不錯的方式~~

    而我在試驗的過程是還沒有寫上 Activated  事件 也是OK!!!
    請你參考看看~ 

    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2011年7月19日 7:13

全部回复

  • dear

    重会事件触发相当繁琐,任一控件的改变都会触发,设中断没用,很可能会被其他事件覆盖

    你可搭配Activated、Paint事件来处理

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
      using (Graphics g = e.Graphics)
      {
        g.Clear(Color.White);
        g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    private void Form1_Activated(object sender, EventArgs e)
    {
      RePaint();
    }
    
    void RePaint()
    {
      using (Graphics g = Graphics.FromHwnd(this.Handle))
      {
        g.Clear(Color.White);
        g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
      using (Graphics g = Graphics.FromHwnd(this.Handle))
      {
        g.Clear(Color.White);
        g.DrawString("Test1", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
      }
    }
    
    
    



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月19日 6:36
  • Hi~

    你可以參考余小章的程式碼~

    剛才我有實作了一下~

    針對你的

    private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
     e.Graphics.DRAW("Hello world!");//DRAW为伪代码  
    
    }

    這部份有些問題~
    如同余小章的此段 Code

     private void Form1_Paint(object sender, PaintEventArgs e)

    {
     using (Graphics g = e.Graphics)
     {
      g.Clear(Color.White);
      g.DrawString("RePaint", new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
     }
    

    試試改成這樣~  或許你就不會出現你的問題了~~~
    當然,余小章說的搭配 Activated 事件 是個非常不錯的方式~~

    而我在試驗的過程是還沒有寫上 Activated  事件 也是OK!!!
    請你參考看看~ 

    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2011年7月19日 7:13