zoukankan      html  css  js  c++  java
  • 【转载】Layered Window(分层窗体,透明窗体)

    //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明
    ModifyStyleEx(0, WS_EX_LAYERED);
     
    效果1.1 窗体整体透明,子控件也透明
     
    //设置Alpha值为150
    BYTE byteAlpha=150;
    SetLayeredWindowAttributes(0,byteAlpha,LWA_ALPHA);
     
    效果1.2 窗体整体透明,子控件不透明
     
    //OnCtlColor中将窗体背景刷为某种单色,比如RGB(255,0,0)
    //在OnPaint中当然也可以
     
    if(nCtlColor=IDD)
    return m_brush; //m_brush.CreateSolidBrush(RGB(255,0,255));
     
    //设置窗体中所有单色区域都透明
    SetLayeredWindowAttributes(RGB(255,0,255),0,LWA_COLORKEY);
     
    效果2.窗体部分透明,但该窗体不支持子控件,不支持OnPaint()
    USES_CONVERSION;
    Image* _pImage=
    Image::FromFile(A2W("F:\Desktop\TestTransparentWnd\test.png"));
    //透明度由PNG图片的Alpha通道决定
     
    //如果加上WS_EX_TRANSPARENT属性,则鼠标会穿透此窗体
    ModifyStyleEx(0, WS_EX_LAYERED/*|WS_EX_TRANSPARENT*/);
     
    CDC *pDCDst=this->GetDC();
    CDC dcSrc;
    dcSrc.CreateCompatibleDC(pDCDst);
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pDCDst,300,300);
    dcSrc.SelectObject(&bmp);
     
    //GDI+显示PNG图片
    Graphics _Graphics(dcSrc.m_hDC);
    _Graphics.DrawImage(_pImage,0,0,300,300);
     
    BLENDFUNCTION _Blend;  
    _Blend.BlendOp=0;
    _Blend.BlendFlags=0;
    _Blend.AlphaFormat=1;
    _Blend.SourceConstantAlpha=255;
     
    //此时,鼠标会穿透窗体中Alpha值为0的区域
    UpdateLayeredWindow(pDCDst,&CPoint(0,0),&CSize(300,300),
                        &dcSrc,&CPoint(0,0),
                        0,&_Blend,ULW_ALPHA);
     
    bmp.DeleteObject();
    dcSrc.DeleteDC();
    _Graphics.ReleaseHDC(dcSrc.m_hDC);
    this->ReleaseDC(pDCDst);
     
    3.既要窗体部分透明(鼠标能穿透窗体中Alpha值为0的区域),还要能显示控件
     
    解决方案:
    创建两个窗体,窗体A使用效果2的方法,作为背景窗体;窗体B使用效果1.2的方法,作为前景窗体,控件都放在窗体B上。在窗体A的OnMove中,同步移动窗体B。
     
    备注:
    1.以上代码只需在窗体初始化的时候(如OnInitDialog)执行一次即可
    2.WS_EX_LAYERED要求宏_WIN32_WINNT >= 0x0500
    3.以上程序需要GDI+支持
     
    参考资料:
  • 相关阅读:
    Mysql配置文件解析
    Mysql的视图
    Setup和 Hold
    洛谷 P2257
    洛谷 P3455
    洛谷 P1447
    洛谷 P1155
    洛谷 P1262
    洛谷 P4180
    洛谷 P5540
  • 原文地址:https://www.cnblogs.com/rainrcn/p/3380347.html
Copyright © 2011-2022 走看看