background image

.NET 框架下使用双缓冲技术绘图

简介
  幸运的是当编写一个典型的 Windows 窗体程序时,窗体和控件的绘制、效果等操作是不需要特别加

 

以考虑的。这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写
一些简单的与事件相关联的代码然后在 IDE 中按 F5,一个完完全全的窗体程序就诞生了!所有控件都
将自己绘制自己,窗体或者控件的大小和缩放都调整自如。在这里经常会用到的,且需要引起一点注意

 

的就是控件效果。游戏,自定义图表控件以及屏幕保护程序的编写会需要程序员额外撰写用于响应 Paint 
事件的代码。
  本文针对那些 Windows 窗体开发人员并有助于他们在应用程序编制过程中使用简单的绘图技术。首
先,我们会讨论一些基本的绘图概念。到底谁在负责进行绘制操作?Windows 窗体程序是如何知道何时
该进行绘制的?那些绘制代码究竟被放置在哪里?之后,还将介绍图像绘制的双重缓冲区技术,你将会

看到它是怎样工作的,怎样通过一个方法来实现缓存和实际显示的图像间的交替。最后,我们将会探讨

智能无效区域 ,实际就是仅仅重绘或者清除应用程序窗体上的无效部分,加快程序的显示和响应速度。
希望这些概念和技术能够引导读者阅读完本文,并且有助于更快和更有效的开发 Windows 窗体程序。
  Windows 窗体使用 GDI+图像引擎,在本文中的所有绘图代码都会涉及使用托管的.Net 框架来操纵
和使用 Windows GDI+图像引擎。
  尽管本文用于基本的窗体绘图操作,但是它同样提供了快速的、有效的且有助于提高程序性能的技
术和方法。所以,在通读本文之前建议读者对.Net 框架有个基本的了解,包括 Windows 窗体事件处理、简
单的 GDI+对象譬如 Line,Pen 和 Brush 等。熟悉 Visual Basic .Net 或者 C#编程语言。
  概念
  Windows 

应用程序是自己负责绘制的,当一个窗体 不干净 了,也就是说窗体改变了大小,或者部

分被其它程序窗体遮盖,或者从最小化状态恢复时,程序都会收到需要绘制的信息。Windows

把这种 不

干净 状态称为 无效的(Invalidated)”状态,我们理解为:需要重绘,当 Windows 窗体程序需要重绘窗体
时 它会 从 Windows 消息 队列 中 获取 绘 制的 信 息。 这 个信 息 经过 .Net 框 架封 装 然后 传 递到 窗 体的 
PaintBackground 

 

和 Paint 事件中去,在上述事件中适当的书写专门用于绘制的代码即可。

  简单的绘图示例如下:

using System;

using System.Drawing;
using System.Windows.Forms; 

public class BasicX : Form {

 public BasicX() {

  InitializeComponent();

 }

 private void BasicX_Paint(object sender, PaintEventArgs e) {

  Graphics g = e.Graphics;

  Pen p = new Pen(Color.Red);

  int width = ClientRectangle.Width;

  int height= ClientRectangle.Height;

  g.DrawLine(p, 0,0, width, height);

  g.DrawLine(p, 0, height, width, 0);

  p.Dispose();

 }

 private void InitializeComponent() {

  this.SetStyle(ControlStyles.ResizeRedraw, true);

  this.ClientSize = new System.Drawing.Size(300, 300);

  this.Text = "BasicX";

  this.Paint += new PaintEventHandler(this.BasicX_Paint);

 }

 [System.STAThreadAttribute()]

 public static void Main() {