这些天在研究半透明不规则窗口的实现,
想必大家都知道很多游戏都用这种窗口做launch界面,如大话西游3,天下3,暗黑3等
看了很多文章、demo,发现大多都是用两个窗口实现,即:
一个虚拟窗口用于绘制半透明窗口(通过UpdateLayeredWindow()接口),
再用一个子窗口(用户实际派生的窗口)绘制控件.
而为了镂空掉这个子窗口的背景,就要将子窗口设置成层级窗口(WS_EX_LAYERED),然后定义一个画刷,该画刷擦背景就用该透明色去擦,擦控件就用实际颜色去擦(OnCtlColor()).这样的话,就牺牲了一个颜色值,比如,当代码编写者使用这个透明色绘制文本的时候,这个文本将什么也看不见。
还有个问题就是两个窗口的移动不完全同步,即拖动半透明窗口的时候,其子窗口的移动总是慢一两拍.总体看来,不是很完美,各位有什么好的方法??
想必大家都知道很多游戏都用这种窗口做launch界面,如大话西游3,天下3,暗黑3等
看了很多文章、demo,发现大多都是用两个窗口实现,即:
一个虚拟窗口用于绘制半透明窗口(通过UpdateLayeredWindow()接口),
再用一个子窗口(用户实际派生的窗口)绘制控件.
而为了镂空掉这个子窗口的背景,就要将子窗口设置成层级窗口(WS_EX_LAYERED),然后定义一个画刷,该画刷擦背景就用该透明色去擦,擦控件就用实际颜色去擦(OnCtlColor()).这样的话,就牺牲了一个颜色值,比如,当代码编写者使用这个透明色绘制文本的时候,这个文本将什么也看不见。
还有个问题就是两个窗口的移动不完全同步,即拖动半透明窗口的时候,其子窗口的移动总是慢一两拍.总体看来,不是很完美,各位有什么好的方法??
窗口没有镂空,不过这样不需要屏蔽一种颜色http://blog.csdn.net/hotpos/article/details/7690531
你这效果不太好,你不要用那么小的图来测试,你拿一张大点的图,拖动一下就知道了,很晃眼.
这是我目前的实现:
http://www.newmuhon.com/files/translucentWnd.rar
对于你说的半透明不规则窗口,不知道需不需要背景的半透明,要是只是和你上图贴的样子的话,用一个对话框LWA_COLORKEY就可以了吧,肯定要损失一个颜色了~可以挑一些不怎么用的颜色,应该就没问题了~如果背景也透明的话,貌似有点困难~估计得用gdi+来实现吧
int main()
{
UpdateLayeredWindow();
return 0;
}就这样是么?
UpdateLayeredWindow();这样的后果是GDI输出的内容全不见了,只能用GDI+效果测试,见我的软件
http://huwenjin.com/a/download/byhuwenjin/2010/1209/21.html