在 TPaintBox、TPanel 或表單 OnPaint 中直接繪製大量資料點(數萬筆),會導致:
Invalidate()/Repaint() 引發嚴重閃爍。在記憶體建立一個與螢幕繪圖區域大小相同的離屏位圖(TBitmap),所有繪圖操作先在該位圖上完成,最後一次性用 BitBlt 或 Canvas->Draw 複製到螢幕裝置環境(DC)。這樣:
// 1. 建立離屏位圖(通常在 FormCreate 或 Resize 時)
Graphics::TBitmap* BufferBmp = new Graphics::TBitmap();
BufferBmp->Width = ClientWidth; // 或 PaintBox 寬高
BufferBmp->Height = ClientHeight;
// 2. 離屏繪圖
BufferBmp->Canvas->Brush->Color = clBtnFace;
BufferBmp->Canvas->FillRect(Rect(0, 0, Width, Height));
// 繪製座標軸、網格、曲線...
BufferBmp->Canvas->MoveTo(x0, y0);
BufferBmp->Canvas->LineTo(x1, y1);
// ... 大量 LineTo / Polyline
// 3. 一次性複製到螢幕
BitBlt(Canvas->Handle, 0, 0, Width, Height,
BufferBmp->Canvas->Handle, 0, 0, SRCCOPY);
// 或 Canvas->Draw(0, 0, BufferBmp);
// 4. 釋放(通常在 FormDestroy)
delete BufferBmp;
new/delete,建立一次,Resize 時調整大小。BitBlt 對應矩形。TPaintBox + OnPaint:在 OnPaint 中直接 BitBlt Buffer,避免重入問題。Polyline 或 PolyPolyline,避免逐點 MoveTo/LineTo。Graphics 繪製到 Bitmap,或 Direct2D 硬體加速。// Form.h
private:
Graphics::TBitmap* FBuffer;
std::vector FWavePoints;
void __fastcall DrawWaveForm();
void __fastcall UpdateBufferSize();
// Form.cpp
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
FBuffer = new Graphics::TBitmap();
DoubleBuffered = true; // VCL 雙緩衝(僅對控件有效,自繪仍需手動)
}
void __fastcall TForm1::FormResize(TObject *Sender) {
UpdateBufferSize();
Invalidate();
}
void __fastcall TForm1::UpdateBufferSize() {
FBuffer->Width = ClientWidth;
FBuffer->Height = ClientHeight;
}
void __fastcall TForm1::DrawWaveForm() {
// 離屏繪製
FBuffer->Canvas->Brush->Color = clBlack;
FBuffer->Canvas->FillRect(Rect(0,0,ClientWidth,ClientHeight));
FBuffer->Canvas->Pen->Color = clLime;
FBuffer->Canvas->Pen->Width = 1;
if (FWavePoints.size() > 1)
FBuffer->Canvas->Polyline(&FWavePoints[0], FWavePoints.size()-1);
}
void __fastcall TForm1::PaintBox1Paint(TObject *Sender) {
DrawWaveForm();
BitBlt(PaintBox1->Canvas->Handle, 0, 0, ClientWidth, ClientHeight,
FBuffer->Canvas->Handle, 0, 0, SRCCOPY);
}
__fastcall TForm1::~TForm1() { delete FBuffer; }
雙緩衝是 Windows GDI 繪圖消除閃爍、提升效能的基石技術。掌握「離屏繪圖 → 一次性 Blit」模式,並結合 Polyline、髒矩形、GDI+ 等進階手段,可輕鬆應對萬級資料點的即時曲線渲染需求。