漸變背景能顯著提升應用程式視覺質感。本文展示在 C++Builder 中利用 OnPaint 事件、RGB 宏與線性插值,繪製垂直方向雙色漸變背景的完整實作。
Width 條垂直線 (每線 1 像素寬)StartColor、結束色 EndColor 分解為 R/G/B 三通道(End - Start) / Widthi 條線顏色 = Start + i * IncrementCanvas->Pen 繪製從頂到期的垂直線
class TForm1 : public TForm {
__published:
TColorDialog *ColorDialog1;
private:
TColor StartColor, EndColor; // 起始/結束顏色
public:
__fastcall TForm1(TComponent* Owner);
};
void __fastcall TForm1::FormCreate(TObject *Sender) {
if (ColorDialog1->Execute()) StartColor = ColorDialog1->Color;
if (ColorDialog1->Execute()) EndColor = ColorDialog1->Color;
}
void __fastcall TForm1::FormPaint(TObject *Sender) {
float pwidth = (float)Width;
int rs = GetRValue(StartColor), gs = GetGValue(StartColor), bs = GetBValue(StartColor);
int re = GetRValue(EndColor), ge = GetGValue(EndColor), be = GetBValue(EndColor);
float rInc = (re - rs) / pwidth;
float gInc = (ge - gs) / pwidth;
float bInc = (be - bs) / pwidth;
for (int i = 0; i < Width; i++) {
Canvas->Pen->Color = (TColor)RGB(
rs + (int)(rInc * i),
gs + (int)(gInc * i),
bs + (int)(bInc * i)
);
Canvas->MoveTo(i, 0);
Canvas->LineTo(i, Height);
}
}
| 函數/宏 | 用途 |
|---|---|
| GetRValue/GetGValue/GetBValue | 從 TColor (0x00BBGGRR) 提取 R/G/B 分量 (0-255) |
| RGB(r,g,b) | 合成 TColor 值 |
| Canvas->Pen->Color | 設定繪圖筆顏色 |
| Canvas->MoveTo/LineTo | 繪製直線 |
| 模式 | 修改要點 |
|---|---|
| 水平漸變 (左→右) | 外層迴圈 for (int y=0; y |
| 對角漸變 | 雙重迴圈計算距離中心/角落距離,依距離插值 |
| 圓形漸變 (同心圓) | 計算中心點,半徑從 max(Width,Height) 遞減至 0,每圈 Canvas->Ellipse,顏色依半徑插值 |
| 多色漸變 | 定義色標陣列 struct {float pos; TColor col;},區段內線性插值 |
TBitmap 離屏繪製後 Canvas->Draw(0,0,bmp),避免閃爍GradientFill (WinAPI) 或 TGPGraphics::FillRectangle (GDI+) 硬體加速OnResize 時預計算顏色表 TColor GradientColors[Width],OnPaint 直接查表繪製此技術雖屬基礎,但掌握「幾何分解 + 色彩插值 + 繪圖 API」三要素組合,即可衍生出豐富多樣的視覺效果,是 UI 客製化開發的入門必修課。