原文:点击打开链接
效果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+
支持