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

分層視窗實現半透明與圖片淡入淡出:WS_EX_LAYERED + AlphaBlend 完整指南

     編輯:關於VC++

建立分層視窗

int CMainFrame::OnCreate(LPCREATESTRUCT lpCS) {
    if (CFrameWnd::OnCreate(lpCS) == -1) return -1;
    ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
    // WS_EX_TRANSPARENT:滑鼠事件穿透到底層視窗
    return 0;
}

設定整體透明度

// 50% 半透明
SetLayeredWindowAttributes(0, 255 * 0.5, LWA_ALPHA);
// 參數:crKey(色鍵), bAlpha(0-255), dwFlags(LWA_ALPHA/LWA_COLORKEY)

圖片淡入淡出:AlphaBlend 實作

void CPictureView::OnDraw(CDC* pDC) {
    if (m_blending) {
        // 1. 離屏 DC 繪製新圖
        CDC memDC; memDC.CreateCompatibleDC(pDC);
        CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, w, h);
        memDC.SelectObject(&bmp);
        m_newPic.Render(&memDC, rect);

        // 2. 計算 alpha (0-255)
        int alpha = ((clock() - m_start) * 255) / 3000; // 3秒完成
        alpha = max(255 - alpha, 0); // 由舊圖淡出

        // 3. AlphaBlend 舊圖疊加
        BLENDFUNCTION bf = { AC_SRC_OVER, 0, (BYTE)alpha, AC_SRC_ALPHA };
        memDC.AlphaBlend(0, 0, w, h, &m_oldMemDC, 0, 0, w, h, bf);

        // 4. 一次性 BitBlt 到螢幕
        pDC->BitBlt(0, 0, w, h, &memDC, 0, 0, SRCCOPY);

        if (alpha > 0) Invalidate(FALSE); // 持續重繪
        else StopBlending(); // 結束
    } else {
        m_currentPic.Render(pDC, rect);
    }
}

關鍵結構 BLENDFUNCTION

typedef struct {
    BYTE BlendOp;     // AC_SRC_OVER = 0
    BYTE BlendFlags;  // 必須 0
    BYTE SourceConstantAlpha; // 0-255
    BYTE AlphaFormat; // AC_SRC_ALPHA = 1 (來源含 alpha 通道)
} BLENDFUNCTION;

進階:GDI+ / WPF / DirectX

  • GDI+:Graphics.DrawImage + ColorMatrix 第 4 行第 4 列設定 alpha
  • WPF:Opacity 屬性動畫、OpacityMask
  • DirectX:IDXTransform 轉換效果(漸變、擦除、推入等)

效果展示

原圖 淡入中 最終圖

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