//為窗體新增
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
();
cdcdcsrc;
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+支援
Layered Window 分層窗體,透明窗體
效果 1.窗體整體透明 支援子控制項,支援onpaint 為窗體新增 ws ex layered屬性,該屬性使窗體支援透明 modifystyleex 0,ws ex layered 效果 1.1 窗體整體透明 子控制項也透明 設定 alpha 值為150 byte bytealpha 150 se...
Layered Window 分層窗體,透明窗體
為窗體新增 ws ex layered屬性,該屬性使窗體支援透明 modifystyleex 0,ws ex layered 效果1.1 窗體整體透明,子控制項也透明 設定alpha 值為150 byte bytealpha 150 setlayeredwindowattributes 0,byte...
Layered Window 分層窗體,透明窗體
2011 10 04 07 53 22 分類 api vc 字型大小 訂閱 為窗體新增 ws ex layered屬性,該屬性使窗體支援透明 modifystyleex 0,ws ex layered 效果1.1 窗體整體透明,子控制項也透明 設定alpha 值為150 byte bytealpha...