首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 啟動畫面淡入淡出實現:使用 SetLayeredWindowAttributes 替代 AnimateWindow

     編輯:程式設計疑難解答

原代碼問題

使用 AnimateWindow 並手動創建定時器,但在 OnCreate 中直接調用 OnCreate 導致消息泵未運行,定時器消息無法觸發。

推薦方案:分層窗口漸變

// 啟動畫面類繼承自 CWnd,創建時設置 WS_EX_LAYERED
BOOL CSplashWnd::Create() {
    CWnd::CreateEx(WS_EX_LAYERED | WS_EX_TOPMOST, 
                   AfxRegisterWndClass(0), _T("Splash"), 
                   WS_POPUP, rect, NULL, 0);
    return TRUE;
}

// 淡入
void FadeIn() {
    for (BYTE alpha = 0; alpha <= 255; alpha += 5) {
        SetLayeredWindowAttributes(0, alpha, LWA_ALPHA);
        Sleep(10); // 或用定時器異步
    }
}

// 淡出
void FadeOut() {
    for (BYTE alpha = 255; alpha >= 0; alpha -= 5) {
        SetLayeredWindowAttributes(0, alpha, LWA_ALPHA);
        Sleep(10);
    }
}

關鍵 API

BOOL SetLayeredWindowAttributes(
    COLORREF crKey,   // 透明色鍵 (不用時為 0)
    BYTE bAlpha,      // 透明度 0-255
    DWORD dwFlags     // LWA_ALPHA 使用 bAlpha
);

完整流程

  1. 創建分層窗口 (WS_EX_LAYERED)
  2. 顯示窗口 (ShowWindow(SW_SHOW))
  3. 異步漸變透明度 0→255 (淡入)
  4. 延時顯示
  5. 異步漸變 255→0 (淡出)
  6. 銷毀窗口

參考資料

SetLayeredWindowAttributes 百度百科

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