码迷,mamicode.com
首页 > 编程语言 > 详细

MFC 对话框透明效果

时间:2016-12-09 16:34:21      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:att   cli   class   窗口   invalid   wal   adl   alpha   box   

网上找的资料自己改了改,在这里记录和分享一下,主要是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 对话框透明效果

标签:att   cli   class   窗口   invalid   wal   adl   alpha   box   

原文地址:http://www.cnblogs.com/john-h/p/6149744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!