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

C++Builder 直接在桌面繪圖技巧

     編輯:關於C++

在 C++Builder 中直接於 Windows 桌面繪製圖像,可用於建立桌面小工具、螢幕標註、教學演示等應用。本文提供最小化完整範例,關鍵在於取得桌面視窗 DC 並繪製至其上。

完整實作步驟

1. 表單類別宣告位圖成員

class TForm1 : public TForm {
private:
    Graphics::TBitmap* Bmp; // 圖像資源
    // ...
};

2. 建構/載入階段初始化

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
    Bmp = new Graphics::TBitmap();
    Bmp->LoadFromFile(L"C:\\AboutLogo.bmp"); // 使用寬字串路徑
}

3. OnPaint 事件繪製至桌面

void __fastcall TForm1::FormPaint(TObject* Sender) {
    HDC hDeskDC = GetWindowDC(GetDesktopWindow()); // 取得桌面 DC
    RECT rect;
    GetWindowRect(GetDesktopWindow(), &rect);      // 取得桌面矩形

    // 計算置中座標
    int x = (rect.right - rect.left - Bmp->Width) / 2;
    int y = (rect.bottom - rect.top - Bmp->Height) / 2;

    // 繪製位圖至桌面 DC
    BitBlt(hDeskDC, x, y, Bmp->Width, Bmp->Height,
           Bmp->Canvas->Handle, 0, 0, SRCCOPY);

    ReleaseDC(GetDesktopWindow(), hDeskDC); // 釋放 DC
}

4. 解構釋放資源

__fastcall TForm1::~TForm1() {
    delete Bmp;
}

關鍵 API 說明

API用途
GetDesktopWindow()取得桌面視窗控制代碼 (覆蓋全螢幕的視窗)
GetWindowDC(hwnd)取得視窗完整繪圖環境 (含非客戶區)
GetWindowRect(hwnd, &rect)取得視窗螢幕座標矩形
BitBlt(hdcDst, x, y, w, h, hdcSrc, xSrc, ySrc, SRCCOPY)像素區塊傳輸繪製
ReleaseDC(hwnd, hdc)釋放 GetWindowDC 取得的 DC

注意事項與最佳實務

  • 桌面重繪:桌面會被系統/其他視窗頻繁重繪,圖像會閃爍或消失。實務應用需攔截桌面重繫訊息或建立透明無焦點視窗覆蓋桌面
  • DPI 感知:高 DPI 環境下座標計算需考慮縮放比例
  • 資源管理:確保 ReleaseDC 配對呼叫,避免 GDI 物件洩漏
  • 權限:Vista+ 需適當權限才能繪製桌面,建議改用分層視窗 (WS_EX_LAYERED)
  • 現代替代方案:Windows 10+ 建議使用 Windows.UI.Composition 或桌面小工具架構

進階應用方向

  • 螢幕截圖標註工具
  • 桌面寵物/動畫吉祥物
  • 投影/教學輔助標記
  • 系統監控資訊浮動顯示

此技巧雖簡單,但理解 DC、視窗座標、GDI 繪圖流程對 Windows 圖形程式設計基礎極有幫助。

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