MFC 对话框透明效果

网上找的资料自己改了改,在这里记录和分享一下,主要是TransparentWnd函数。

在子类的OnShowWindow函数中调用 ShowWindowAlpha()

#pragma once
template<class T>
class CPopupDlgBaseT
{
    typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)
        (HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);

public:
    void ShowWindowAlpha()
    {
        T* pT = static_cast<T*>(this);
        CWnd* pParentWnd = pT->GetParent();
     if (NULL != pParentWnd)
     {   CRect rc;   pParentWnd
->GetClientRect(&rc);   pParentWnd->ClientToScreen(&rc);   pT->MoveWindow(&rc);
    } TransparentWnd(pT
->m_hWnd, 150); } private: BOOL TransparentWnd(HWND hwnd, BYTE byAlpha) { long lStyle; HMODULE hModule; BOOL bRet; LPFNSETLAYEREDWINDOWATTRIBUTES lpSetLayeredWindowAttributes; if(FALSE == IsWindow(hwnd)) { MessageBox(hwnd, TEXT("窗口句柄无效!"), NULL, 0); return FALSE; } hModule = (HMODULE)LoadLibrary(TEXT("user32.dll")); if(hModule) { lpSetLayeredWindowAttributes = (LPFNSETLAYEREDWINDOWATTRIBUTES) GetProcAddress(hModule, "SetLayeredWindowAttributes"); if(!lpSetLayeredWindowAttributes) { MessageBox(hwnd, TEXT("未找到API SetLayeredWindowAttributes的地址!"), NULL, MB_OK); return FALSE; } } lStyle = GetWindowLong(hwnd, GWL_EXSTYLE); if(!lStyle) { MessageBox(hwnd, TEXT("获取窗口扩展样式失败!"), NULL, MB_OK); return FALSE; } lStyle = lStyle | WS_EX_LAYERED; bRet = SetWindowLong(hwnd, GWL_EXSTYLE, lStyle); if(!bRet) { MessageBox(hwnd, TEXT("设置窗口扩展样式失败!"), NULL, MB_OK); return FALSE; } bRet = lpSetLayeredWindowAttributes(hwnd, 0, byAlpha, LWA_ALPHA); if(!bRet) { MessageBox(hwnd, TEXT("设置窗口透明度失败!"), NULL, MB_OK); return FALSE; } ::RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); FreeLibrary(hModule); return TRUE; } };

 

posted @ 2016-12-09 15:35  程序员大叔  阅读(2407)  评论(0编辑  收藏  举报