设备描述表与TCanvas(Device Contexts and TCanvas)
Windows使用术语设备描述表(device context,后面简称为DC)描述用户可在其上画图的画布。DC可用来在许多表面上画图:
- 窗口客户区或框架(To a window's client area or frame)
- 桌面(To the desktop)
- 内存(To memory)
- 打印机或其他输出设备(To a printer or other output device)
这些仅仅是一些列子,还有许多其他的不太为人所知的DC(如菜单),但是以上列举都是用户非常感兴趣的DC。
在API级别处理DC要复杂些。首先必须从Windows中的到DC处理程序。然后选择各种对象进入DC中(笔pen、刷子brush、字体font),然后便可在DC中画图,画图完毕后,必须确保进入DC的各种对象在清除之后再删除DC。如果忘记清除DC中的各种对象,应用程序将使内存溢出。
幸运的是VCL提供有TCanvas类以便较容易地处理DC。举一个简单的例子,下面的程序使用Windows API在屏幕上绘制圆,内圆为红色,边框为蓝色。
procedure TForm1.Button1Click(Sender: TObject);
var
DC: HDC;
Brush, OldBrush: HBRUSH;
Pen, OldPen: HPEN;
begin
DC := GetDC(Handle);
Brush := CreateSolidBrush(RGB(255, 0, 0));
Pen := CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
OldBrush := SelectObject(DC, Brush);
OldPen := SelectObject(DC, Pen);
Ellipse(DC, 20, 20, 120, 120);
SelectObject(DC, OldBrush);
SelectObject(dc, OldPen);
ReleaseDC(Handle, DC);
end;
以上代码是不是太差,但是当处理完DC之后,使人容易忘记恢复对象,如果忘记了,其应用程序将会资源泄露。下面的代码与上面代码等价,但是用VCL写的:
procedure TForm1.Button2Click(Sender: TObject);
begin
Canvas.Brush.Color := clRed;
Canvas.Pen.Color := clBlue;
Canvas.Ellipse(20, 20, 120, 120);
end;
该代码不但短小易读,而且也很健壮。
TCanvas根据需要负责释放资源,因此不必担心资源问题。
TCanvas是一种比使用API更简单有效的方法。
TCanvas继承关系如下: