在使用 SetLayeredWindowAttributes 實現半透明視窗時,編譯器可能報錯:error C2065: 'LWA_COLORKEY' : undeclared identifier。即使已包含 WinUser.h,問題依然存在。
LWA_COLORKEY 是條件編譯定義的,取決於 _WIN32_WINNT 宏的版本號。若未正確定義該宏,相關常數不會被編譯器識別。
在 #include "WinUser.h" 之前添加以下宏定義:
#define _WIN32_WINNT 0x0502
#include "WinUser.h"
0x0502 對應 Windows Server 2003 / Windows XP SP1 及以上版本,確保分層視窗相關常數被啟用。
#define _WIN32_WINNT 0x0502
#include <windows.h>
// ... 其他頭文件
// 設置擴展視窗樣式
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
// 動態載入 User32.dll 並獲取函數指針
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if (hInst) {
typedef BOOL (WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
MYFUNC fun = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if (fun) {
// 使用 LWA_COLORKEY 實現透明色鍵
fun(this->GetSafeHwnd(), GetSysColor(COLOR_BTNFACE), 129, LWA_COLORKEY);
}
FreeLibrary(hInst);
}
編譯後即可正常使用 LWA_COLORKEY 實現視窗透明效果。