想在應用程式中重現 Windows 關機時畫面逐漸變暗的視覺效果?利用 GDI 的 Pattern Brush(模式畫刷) 搭配 PatBlt 即可輕鬆實作。本文解析核心原理並提供可直接在 C++ Builder 中編譯的完整程式碼。
CreatePatternBrush 畫刷,畫刷會以此模式重複填滿區域。GetDC(0)),選入畫刷。PatBlt 以 0xA000C9 (PATINVERT) 光柵運算碼,將畫刷模式與螢幕像素做 XOR 反相,產生「半透明暗幕」視覺效果。InvalidateRect(0, NULL, TRUE) 強制全螢幕重繪。// 全域點陣圖模式:棋盤格
unsigned char g_Bits[16] = {
0x55, 0x00, 0xAA, 0x00,
0x55, 0x00, 0xAA, 0x00,
0x55, 0x00, 0xAA, 0x00,
0x55, 0x00, 0xAA, 0x00
};
HBITMAP g_hBmp = nullptr;
HBRUSH g_hBrush = nullptr;
// --- 按鈕 1:啟動暗幕 ---
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 1. 建立 8x8 單色點陣圖
g_hBmp = CreateBitmap(8, 8, 1, 1, g_Bits);
// 2. 建立模式畫刷
g_hBrush = CreatePatternBrush(g_hBmp);
// 3. 取得全螢幕 DC
HDC hScreenDC = GetDC(0);
// 4. 選入畫刷
HBRUSH hOldBrush = (HBRUSH)SelectObject(hScreenDC, g_hBrush);
// 5. PATINVERT (0xA000C9) 反相填滿
PatBlt(hScreenDC, 0, 0, Screen->Width, Screen->Height, 0xA000C9);
// 6. 清理
SelectObject(hScreenDC, hOldBrush);
ReleaseDC(0, hScreenDC);
// 注意:此處不刪除 g_hBmp/g_hBrush,留待還原時釋放
}
// --- 按鈕 2:還原螢幕 ---
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 強制全螢幕重繪,消除 XOR 殘留
InvalidateRect(0, nullptr, TRUE);
// 釋放 GDI 物件
if (g_hBrush) { DeleteObject(g_hBrush); g_hBrush = nullptr; }
if (g_hBmp) { DeleteObject(g_hBmp); g_hBmp = nullptr; }
}
0xA000C9 為 PATINVERT:D = D XOR Pattern。同一區域執行兩次即可還原,但這裡改用 InvalidateRect 讓系統自行重繪更乾淨。CreateBitmap(8,8,1,1,...) 參數:寬、高、色板數=1、位元平面數=1 → 單色點陣圖。AlphaBlend(需 Layered Window)。僅需幾行 GDI API,即可在不依賴 DirectX/OpenGL 的情況下,打造專業級的全螢幕視覺轉場效果。