本文介紹如何利用 Windows API SetLayeredWindowAttributes 實作視窗平滑淡出關閉的視覺效果,讓應用程式介面更具現代感。
SetLayeredWindowAttributes 位於 USER32.DLL,需動態載入該 DLL 並取得函式指標。
在對話方塊的 OnInitDialog 或視窗的 OnCreate 中加入:
SetWindowLong(m_hWnd, GWL_EXSTYLE,
::GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
接著呼叫自訂的 SetTransparent 函式初始化透明度:
SetTransparent(m_hWnd, 0, 255, LWA_ALPHA); // 完全不透明
SetTransparent 實作範例:
BOOL SetTransparent(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
{
typedef BOOL (WINAPI* LPFN_SETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF, BYTE, DWORD);
static LPFN_SETLAYEREDWINDOWATTRIBUTES pFn = NULL;
if (!pFn)
{
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
if (hUser32)
pFn = (LPFN_SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
}
if (pFn)
return pFn(hWnd, crKey, bAlpha, dwFlags);
return FALSE;
}
在 OnClose 中呼叫 CloseSmoothly:
void CMyDialog::CloseSmoothly()
{
for (int nPercent = 100; nPercent >= 0; nPercent--)
{
BYTE alpha = (BYTE)(255 * nPercent / 100);
SetTransparent(m_hWnd, 0, alpha, LWA_ALPHA);
Sleep(10); // 控制動畫速度
}
}
Sleep 時間控制淡出快慢。