【Delphi】使用双缓冲解决图片切换时的闪烁问题

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;

你可能感兴趣的:(Random)