首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

模擬 Windows 關機畫面淡出效果:GDI 畫刷實作

     編輯:關於C++

想在應用程式中重現 Windows 關機時畫面逐漸變暗的視覺效果?利用 GDI 的 Pattern Brush(模式畫刷) 搭配 PatBlt 即可輕鬆實作。本文解析核心原理並提供可直接在 C++ Builder 中編譯的完整程式碼。

效果原理

  1. 建立一個 8×8 像素的單色點陣圖,內容為交錯的 0x55/0xAA 位元模式(棋盤格)。
  2. 以此點陣圖建立 CreatePatternBrush 畫刷,畫刷會以此模式重複填滿區域。
  3. 取得全螢幕裝置內容 (GetDC(0)),選入畫刷。
  4. 呼叫 PatBlt 以 0xA000C9 (PATINVERT) 光柵運算碼,將畫刷模式與螢幕像素做 XOR 反相,產生「半透明暗幕」視覺效果。
  5. 還原時呼叫 InvalidateRect(0, NULL, TRUE) 強制全螢幕重繪。

完整程式碼 (C++ Builder VCL)

// 全域點陣圖模式:棋盤格
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 → 單色點陣圖。
  • 若需調整暗度,可修改點陣圖模式(如增加 0x00 比例)或改用 AlphaBlend(需 Layered Window)。

應用場景

  • 自訂關機/待機倒數視窗
  • 全螢幕截圖前的視覺提示
  • Kiosk 模式下的鎖定畫面轉場

僅需幾行 GDI API,即可在不依賴 DirectX/OpenGL 的情況下,打造專業級的全螢幕視覺轉場效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved