//
为窗体添加
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+支持
参考资料: