gdi+ 局部刷新(区域的失效)
来源:互联网 发布:淘宝网民族风女装刺绣 编辑:程序博客网 时间:2024/05/16 15:32
要实现局部刷新,我们就必须调用onpaint方法,但是如果用refresh那么就是全局刷新,这样很影响效率。
但是局部刷新怎么办?那就要用到区域的失效,我们迫使窗体的一个区域失效(Invalidate(region or rectangle)
,调用系统的onapint函数,
系统就会刷新失效的区域。这样就可以做到局部刷新了。
一般情况下,如果你调用了invalidate方法,系统会在满足条件的情况下刷新区域,但是我们也可以强制进行调用
onpaint函数,就是this.Uptate();
一下是代码:有三个区域rectangle,分别画不同的图形。
- public partial class Form1 : Form
- {
- Rectangle rect1;
- Rectangle rect2;
- Rectangle rect3;
- Timer timer;
- public Form1()
- {
- InitializeComponent();
- rect1 = new Rectangle(10, 10, 200, 20);
- rect2 = new Rectangle(350, 50, 100, 20);
- rect3 = new Rectangle(10, 70, 50, 50);
- timer = new Timer();
- timer.Enabled = true;
- timer.Interval = 500;
- timer.Tick += new EventHandler(Timer_Tick);
- }
- private void Timer_Tick(object sender, EventArgs e)
- {
- Graphics g = this.CreateGraphics();
- draw(g);
- }
- private void draw(Graphics g)
- {
- g.SetClip(this.ClientRectangle);
- int value = new Random().Next(1, 4);
- switch (value)
- {
- case 1: this.Invalidate(rect1); /*refreshRect1(g);*/ toolStripStatusLabel1.Text = "Rect1"; break;
- case 2: this.Invalidate(rect2);/* refreshRect2(g);*/ toolStripStatusLabel1.Text = "Rect2"; break;
- case 3: this.Invalidate(rect3); /*refreshRect3(g);*/ toolStripStatusLabel1.Text = "Rect3"; break;
- }
- this.Update();
- }
- private void refreshRect1(Graphics g)
- {
- Color[] _colors = new Color[] { Color.Red, Color.Blue,
- Color.Yellow, Color.Tomato, Color.RosyBrown };
- Random r = new Random();
- int i= r.Next(0, 5);
- g.SetClip(rect1, System.Drawing.Drawing2D.CombineMode.Replace);
- g.FillRectangle(new SolidBrush(_colors[i]), rect1);
- }
- private void refreshRect2(Graphics g)
- {
- g.SetClip(rect2, System.Drawing.Drawing2D.CombineMode.Replace);
- g.FillRectangle(Brushes.White, rect2);
- g.DrawString(DateTime.Now.ToString("HH:mm:ss"), Font, Brushes.RosyBrown, rect2);
- }
- private void refreshRect3(Graphics g)
- {
- g.SetClip(rect3, System.Drawing.Drawing2D.CombineMode.Replace);
- g.FillRectangle(Brushes.White, rect3);
- g.TranslateTransform(25, 90);
- int i = new Random().Next(0, 360);
- g.RotateTransform(i);
- g.DrawLines(Pens.Brown, new Point[] { new Point(0, -20), new Point(-17, 10),new Point(17,0),new Point(0,-20)});
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- Graphics g = e.Graphics;
- refreshRect1(g);
- refreshRect2(g);
- refreshRect3(g);
- }
- gdi+ 局部刷新(区域的失效)
- DirectFB学习--局部区域刷新
- 用JScrollPane局部刷新当前可视区域的table
- 【局部刷新】GetUpdateRect和GetClipBox 获取无效区域的区别
- ajax局部刷新后里面的jquery事件失效的解决方法
- 关于ajax局部刷新后,js绑定事件失效的问题
- .net 的局部刷新
- RecyclerView的局部刷新
- listview的局部刷新
- ListView的局部刷新
- ListView的局部刷新
- listview的局部刷新
- ListView的局部刷新
- listview的局部刷新
- ListView的局部刷新
- ListView的局部刷新
- ListView 的局部刷新
- RecyclerView的局部刷新
- [转帖]在客户端验证密码强度[2],兼容FireFox和IE
- xslt转化xml的最简单例子
- 中国互联网发展史
- 关于SSH登录出现Connection reset by peer 问题。
- gridview导出数据时常见异常的处理
- gdi+ 局部刷新(区域的失效)
- SUN:当前更需要创新来驱动经济发展
- HttpModule,HttpHandler,HttpHandlerFactory简单使用
- 值得用一生回味的经典语录
- 在XP下oracle端口穿防火墙问题
- 国家版权局:微软技术垄断会适得其反
- 使用KSES安全过滤输入数据
- jsp include 乱码问题的解决(自http://rainbow686.javaeye.com/blog/123363)
- 零开始Hibernate旅程(一个例子)