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

使用 Visual C++ 設計異形透明「精靈」窗體

     編輯:關於VC++

效果預覽

透明精靈窗體疊加在 VC++ IDE 上

核心原理

異形窗體實現需解決兩大問題:背景透明 與 窗口區域裁剪。

  • 背景繪製: 處理 WM_ERASEBKGND,用位圖填充客戶區,返回 TRUE 阻止默認擦除。
  • 區域裁剪: 利用 SetWindowRgn() 將窗口可見區域限制為位圖中非透明色素區域。採用「掩模位圖」像素級掃描:白色 (RGB(255,255,255)) 視為透明,創建 1x1 微區域並以 RGN_XOR 從完整矩形區域中排除。

關鍵實現代碼


void CMyWnd::Display(CDC* pDC, UINT nMaskId)
{
    CRect rectWnd; GetWindowRect(rectWnd);
    CBitmap bmp; bmp.LoadBitmap(nMaskId);
    CDC memDC; memDC.CreateCompatibleDC(pDC);
    CBitmap* pOld = memDC.SelectObject(&bmp);

    CRgn rgnWnd, rgnTemp;
    rgnWnd.CreateRectRgn(0, 0, rectWnd.Width(), rectWnd.Height());

    for (int x = 0; x < rectWnd.Width(); ++x) {
        for (int y = 0; y < rectWnd.Height(); ++y) {
            if (memDC.GetPixel(x, y) == RGB(255,255,255)) {
                rgnTemp.CreateRectRgn(x, y, x+1, y+1);
                rgnWnd.CombineRgn(&rgnWnd, &rgnTemp, RGN_XOR);
                rgnTemp.DeleteObject();
            }
        }
    }
    memDC.SelectObject(pOld);
    SetWindowRgn((HRGN)rgnWnd, TRUE);
}

完整類結構

  • CMyWnd : public CWnd 封裝初始化、顯示、區域計算、背景繪製。
  • 重寫 OnEraseBkgnd 繪製前景位圖(IDB_SHOW)。
  • 處理 WM_NCHITTEST 返回 HTCAPTION 實現任意拖動。
  • 處理 WM_CHAR 捕獲 VK_ESCAPE 退出程序。

編程步驟

  1. 建立 Win32 應用程序專案。
  2. 用 ClassWizard 添加 CMyWnd 類(基類 CWnd)。
  3. 導入背景圖 IDB_SHOW 與掩模圖 IDB_MASK(BMP 格式,可真彩色)。
  4. 在 InitInstance 中創建窗口、調用 Initialize、ShowWindow。

適用範圍

該方法適用於所有 CWnd 派生類(對話框、視圖、框架窗口等),可創建任意不規則形狀窗體。

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