博客日历
2024年05月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
29 | 30 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
存档
2024年03月 04月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
Layered Window(分层窗体,透明窗体)
效果1.窗体整体透明,支持子控件,支持OnPaint()
//为窗体添加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中当然也可以
//在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+支持
参考资料:
案例:仿Macintosh dock(苹果机工具栏)
分类:Win32/C++ 查看次数:16360 发布时间:2010/3/11 13:16:47