- 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