gdi+ 局部刷新(区域的失效)

来源:互联网 发布:淘宝网民族风女装刺绣 编辑:程序博客网 时间:2024/05/16 15:32

要实现局部刷新,我们就必须调用onpaint方法,但是如果用refresh那么就是全局刷新,这样很影响效率。

但是局部刷新怎么办?那就要用到区域的失效,我们迫使窗体的一个区域失效(Invalidate(region or rectangle)

,调用系统的onapint函数,

系统就会刷新失效的区域。这样就可以做到局部刷新了。

一般情况下,如果你调用了invalidate方法,系统会在满足条件的情况下刷新区域,但是我们也可以强制进行调用

onpaint函数,就是this.Uptate();

一下是代码:有三个区域rectangle,分别画不同的图形。

 

 

  1.  public partial class Form1 : Form
  2.     {
  3.         Rectangle rect1;
  4.         Rectangle rect2;
  5.         Rectangle rect3;
  6.         Timer timer;
  7.         public Form1()
  8.         {
  9.             InitializeComponent();
  10.             rect1 = new Rectangle(10, 10, 200, 20);
  11.             rect2 = new Rectangle(350, 50, 100, 20);
  12.             rect3 = new Rectangle(10, 70, 50, 50);
  13.             timer = new Timer();
  14.             timer.Enabled = true;
  15.             timer.Interval = 500;
  16.             timer.Tick += new EventHandler(Timer_Tick);
  17.             
  18.         }
  19. private void Timer_Tick(object sender, EventArgs e)
  20.         {
  21.             Graphics g = this.CreateGraphics();
  22.             draw(g);           
  23.         }
  24.         private void draw(Graphics g)
  25.         {
  26.             g.SetClip(this.ClientRectangle);
  27.             int value = new Random().Next(1, 4);
  28.             switch (value)
  29.             {
  30.                 case 1: this.Invalidate(rect1); /*refreshRect1(g);*/ toolStripStatusLabel1.Text = "Rect1"break;
  31.                 case 2: this.Invalidate(rect2);/* refreshRect2(g);*/ toolStripStatusLabel1.Text = "Rect2"break;
  32.                 case 3: this.Invalidate(rect3); /*refreshRect3(g);*/ toolStripStatusLabel1.Text = "Rect3"break;
  33.             }
  34.             this.Update();
  35.         }
  36.         private void refreshRect1(Graphics g)
  37.         {
  38.             Color[] _colors = new Color[] { Color.Red, Color.Blue,
  39.                 Color.Yellow, Color.Tomato, Color.RosyBrown };
  40.             Random r = new Random();
  41.             int i= r.Next(0, 5);
  42.             g.SetClip(rect1, System.Drawing.Drawing2D.CombineMode.Replace);
  43.             g.FillRectangle(new SolidBrush(_colors[i]), rect1);
  44.         }
  45.         private void refreshRect2(Graphics g)
  46.         {
  47.             g.SetClip(rect2, System.Drawing.Drawing2D.CombineMode.Replace);
  48.             g.FillRectangle(Brushes.White, rect2);
  49.             g.DrawString(DateTime.Now.ToString("HH:mm:ss"), Font, Brushes.RosyBrown, rect2);
  50.             
  51.             
  52.         }
  53.         private void refreshRect3(Graphics g)
  54.         {
  55.             g.SetClip(rect3, System.Drawing.Drawing2D.CombineMode.Replace);
  56.             g.FillRectangle(Brushes.White, rect3);
  57.             g.TranslateTransform(25, 90);
  58.             int i = new Random().Next(0, 360);
  59.             g.RotateTransform(i);
  60.             g.DrawLines(Pens.Brown, new Point[] { new Point(0, -20), new Point(-17, 10),new Point(17,0),new Point(0,-20)});
  61.             
  62.             
  63.         }
  64.         protected override void OnPaint(PaintEventArgs e)
  65.         {
  66.             base.OnPaint(e);
  67.             Graphics g = e.Graphics;
  68.             refreshRect1(g);
  69.             refreshRect2(g);
  70.             refreshRect3(g);
  71.         }