- var
- TempCanvas: TCanvas;
- BufDC: HDC;
- BufBitmap: HBITMAP;
- begin
- // 创建一个与显示设备兼容的内存设备
- BufDC := CreateCompatibleDC(Canvas.Handle);
- // 创建一个与显示设备兼容的位图
- BufBitmap := CreateCompatibleBitmap(Canvas.Handle, ClientWidth, ClientHeight);
- // 将设备与位图关联
- SelectObject(BufDC, BufBitmap);
- // CreateCompatibleBitmap创建位图后数据初始化为0,而RGB(0,0,0)则表示是黑色
- // 这里需要清除其黑色背景,使其变为透明
- PerformEraseBackground(Self, BufDC);
- // 临时的Canvas,用来画图用,但它并不是必须的,可以直接使用GDI函数来画图
- TempCanvas := TCanvas.Create;
- // 关联到内存设备
- TempCanvas.Handle := BufDC;
- // 可以开始画图了,这里演示用随机颜色画边框
- Randomize;
- TempCanvas.Brush.Color := Random($FFFFFF);
- TempCanvas.FrameRect(ClientRect);
- // 一次性将内存图像数据覆盖过去,因为跳过了擦除背景过程,所以避免了闪烁的问题
- BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight, TempCanvas.Handle, 0, 0, SRCCOPY);
- // 释放资源
- DeleteDC(BufDC);
- DeleteObject(BufBitmap);
- FreeAndNil(TempCanvas);
- end;
http://blog.csdn.net/aqtata/article/details/7710655