MFC 对话框(窗口)透明

程序的实现步骤基本就是这样,当然也有其他方法。希望大家能积极开拓,展示更多方法。

    SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
#ifdef _UNICODE
    HINSTANCE hInst = LoadLibrary(_T("User32.DLL")); //显式加载DLL
#else
    HINSTANCE hInst = LoadLibrary("User32.DLL"); //显式加载DLL
#endif  
    if (hInst)
    {
        typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);
        MYFUNC fun = NULL;

        //取得SetLayeredWindowAttributes函数指针
        fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
        if (fun)
            fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);     //通过第三个参数来设置窗体透明程度

        FreeLibrary(hInst);
    }
///创建背景刷
CBrush m_bkBrush;

HBRUSH CMyProgressCtrl2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  Change any attributes of the DC here
    if(nCtlColor == CTLCOLOR_DLG)   // 判断是否是对话框  
    {
        return   m_bkBrush; // 返回刚才创建的背景刷子
    }
    if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC_Percentage)
    {
        pDC->SetArcDirection(18);
        pDC->SetTextColor(RGB(0,0,0));///静态文本框字体颜色
//      return   m_bkBrush; // 返回刚才创建的背景刷子

        pDC->SetBkColor(RGB(255,255,255));     //静态控件的背景颜色设置和窗口背景一样,也会为透明,方法一        
        //pDC->SetBkMode(TRANSPARENT);    //静态文本框背景设置为透明,方法二
        hbr=(HBRUSH)m_bkBrush; 
    }
        else if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_STATIC_Progress2)///也可以指定特定ID对应的控件
    {
        pDC->SetArcDirection(18);
        return   m_StaticBrush; // 返回刚才创建的背景刷子
    }
    // TODO:  Return a different brush if the default is not desired
    return hbr;
}

不过处理后的透明效果都不是太好,控件边界有一些毛刺

对重要一句话解释:fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);
关于参数解释点击原博主内容
下面是我复制过来的

使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。

以下是MSDN上的原内容,我会加以解释。

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

BOOL SetLayeredWindowAttributes(
    HWND hwnd,
    COLORREF crKey,
    BYTE bAlpha,
    DWORD dwFlags
);
参数:

hwnd
[in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.

crKey
[in] COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro.

bAlpha
[in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.

dwFlags
[in] Specifies an action to take. This parameter can be one or more of the following values.
LWA_COLORKEY
Use crKey as the transparency color.
LWA_ALPHA
Use bAlpha to determine the opacity of the layered window.

Return Value

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

详细解说

参数1、主要说的是所要设置的窗体必须是WS_EX_LAYERED格式,设置方法如下:

           //设置窗体为WS_EX_LAYERED格式

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 

GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);     

//其实0x80000 == WS_EX_LAYERED
参数1:窗口句柄

参数2:意思是可以设置指定的颜色为透明色,通过RGB宏设置。

参数3:可以简单的理解为窗体透明的程度范围为0~2550为完全透明,255不透明)。需要参数4设置为2,这种情况下的透明是对窗口以及控件都进行处理。这个时候参数2无效。

参数4:可以取两个值LWA_COLORKEY (0x1)和 LWA_ALPHA(0x2),如下:

    取值为LWA_ALPHA即等于2时,参数2无效,通过参数3决定透明度.

    取值为LWA_COLORKEY即等于1时,参数3无效,参数2指定的颜色为透明色,其他颜色则正常显示,你可以在处理前先设定号窗口的背景颜色


把以下代码放OnInitDialog中即可实现半透明窗体

SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, 
    GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);

HINSTANCE hInst = LoadLibrary("User32.DLL"); //显式加载DLL
if (hInst) 
{            
    typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);          
    MYFUNC fun = NULL;

    //取得SetLayeredWindowAttributes函数指针     
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
    if (fun)
        fun(this->GetSafeHwnd(), 0, 128, 2);     //通过第三个参数来设置窗体透明程度
    FreeLibrary(hInst); 
}

另外有一点需要注意的是:
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性。
 函数原型:LONG
GetWindowLong(HWND hWnd;int nlndex);
 参数:
  hWnd:窗口句柄及间接给出的窗口所属的窗口类。
  nlndex:指定要检索的基于0的的偏移量。有效值的范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:
  GWL_EXSTYLE:获得扩展窗口风格。
  GWL_STYLE:获得窗口风格。
  GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。
  GWL_HINSTANCE:获得应用事例的句柄。
  GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
  GWL_ID:获得窗口标识。
  GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个与这个窗口相关的给用户使用的32位的数据。具体用途自定义。
  在hWnd参数标识了一个对话框时也可用下列值:
  DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
  DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
  DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
 返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用 GetLastError函数。
 备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留额外类的存储空间。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值