您的位置:首页 > 其它

vc 实现透明窗口和不规则窗口

2015-09-30 10:54 405 查看
做一个vc项目的时候,用到了不规则-透明窗口,中间走了几个弯路,在此总结一下:

相关的函数:

1

intSetWindowRgn(
HWNDhWnd,//handletowindow
HRGNhRgn,//handletoregion
BOOLbRedraw//windowredrawoption
);

这个函数,没有太多的限制,只要hRgn正确,效果就会出现,但是有个缺点,就是使用该函数制作的不规则窗口可能出现锯齿

示例:

HRGNhRgn=CreateEllipticRgn(0,0,100,100);
SetWindowRgn(hwnd,hRgn,TRUE);



2BOOLSetLayeredWindowAttributes(
HWNDhwnd,
COLORREFcrKey,
BYTEbAlpha,
DWORDdwFlags
);

这个函数限制较大,它只能用于非child窗口,适合于背景为png图片的不规则窗口,同样可能会有锯齿出现,但是可以放控件。

示例,原始效果:




执行

//SetWS_EX_LAYEREDonthiswindow
SetWindowLong(hwnd,
GWL_EXSTYLE,
GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
//Makethiswindow70%alpha
SetLayeredWindowAttributes(hwnd,RGB(255,255,255),
(255*70)/100,LWA_ALPHA|LWA_COLORKEY);
效果:





3

BOOLUpdateLayeredWindow(
HWNDhwnd,
HDChdcDst,
POINT*pptDst,
SIZE*psize,
HDChdcSrc,
POINT*pptSrc,
COLORREFcrKey,
BLENDFUNCTION*pblend,
DWORDdwFlags
);

这个函数同样可以实现透明-不规则窗口,但是同样只适用于非child窗口,但是它可以抗锯齿。

由于该函数改变了窗口的绘制机制,因此使用了该函数的窗口是不会收到WM_PAINT消息的,因此无法放置控件。

示例:

Imageimage(L"apple.png");
Bitmapbitmap(100,100);
Graphicstg(&bitmap);
tg.Clear(Color(0,255,255,255));
tg.DrawImage(&image,Rect(0,0,100,100),
0,0,image.GetWidth(),image.GetHeight(),UnitPixel);
HBITMAPhBitmap=NULL;
bitmap.GetHBITMAP(Color(0,0,0),&hBitmap);
HDChdc=GetDC(hwnd);
HDChdcMem=CreateCompatibleDC(hdc);
SelectObject(hdcMem,hBitmap);
POINTptDest={0,0};
POINTptSrc={0,0};
SIZEsize={100,100};
BLENDFUNCTIONblend;
blend.AlphaFormat=AC_SRC_ALPHA;
blend.BlendFlags=0;
blend.BlendOp=AC_SRC_OVER;
blend.SourceConstantAlpha=255*70/100;
SetWindowLong(hwnd,
GWL_EXSTYLE,
GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);UpdateLayeredWindow(hwnd,hdc,&ptDest,&size,
hdcMem,&ptSrc,RGB(0,0,0),&blend,LWA_ALPHA|LWA_COLORKEY);
DeleteDC(hdcMem);
ReleaseDC(hwnd,hdc);

效果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: