MFC 对话框透明效果

Posted K.I.S.S.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
        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;
    }
};

 

以上是关于MFC 对话框透明效果的主要内容,如果未能解决你的问题,请参考以下文章

mfc设置dialog对话框透明

MFC对话框贴图基础上控件Stasic变成透明的

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?

C++ 代码片段(积累)

无法使自定义 DialogFragment 在 Fragment 上透明

MFC设置对话框背景色及控件颜色