这些天在研究半透明不规则窗口的实现,
想必大家都知道很多游戏都用这种窗口做launch界面,如大话西游3,天下3,暗黑3等
看了很多文章、demo,发现大多都是用两个窗口实现,即:
一个虚拟窗口用于绘制半透明窗口(通过UpdateLayeredWindow()接口),
再用一个子窗口(用户实际派生的窗口)绘制控件.
而为了镂空掉这个子窗口的背景,就要将子窗口设置成层级窗口(WS_EX_LAYERED),然后定义一个画刷,该画刷擦背景就用该透明色去擦,擦控件就用实际颜色去擦(OnCtlColor()).这样的话,就牺牲了一个颜色值,比如,当代码编写者使用这个透明色绘制文本的时候,这个文本将什么也看不见。
还有个问题就是两个窗口的移动不完全同步,即拖动半透明窗口的时候,其子窗口的移动总是慢一两拍.总体看来,不是很完美,各位有什么好的方法??

解决方案 »

  1.   

    大侠不敢当我实现过一种假效果
    窗口没有镂空,不过这样不需要屏蔽一种颜色http://blog.csdn.net/hotpos/article/details/7690531
      

  2.   


    你这效果不太好,你不要用那么小的图来测试,你拿一张大点的图,拖动一下就知道了,很晃眼.
    这是我目前的实现:
    http://www.newmuhon.com/files/translucentWnd.rar
      

  3.   

    GDI+ png绘制界面,再用GDI+直接绘制控件。其它的不多说了
      

  4.   

    我做过背景半透明的,控件和字体不透明的dialog,但是是规则的四方的对话框,就是你说的用多层的思路做的,半透明的背景对话框用LWA_ALPHA类型的dialog,控件的放置的对话框用LWA_COLORKEY类型的对话框,然后实现联动就可以了。
    对于你说的半透明不规则窗口,不知道需不需要背景的半透明,要是只是和你上图贴的样子的话,用一个对话框LWA_COLORKEY就可以了吧,肯定要损失一个颜色了~可以挑一些不怎么用的颜色,应该就没问题了~如果背景也透明的话,貌似有点困难~估计得用gdi+来实现吧
      

  5.   

    直接使用PNG图片,用GDI+绘制到你透明窗口主行了。不会少任何色,这个PNG图片哪里有阴影,哪里是透明的,你的窗口也是什么样子就用你那个函数就行了。
      

  6.   


    int main()
    {
    UpdateLayeredWindow();
    return 0;
    }就这样是么?
      

  7.   

    OnPaint里绘制,然后
    UpdateLayeredWindow();这样的后果是GDI输出的内容全不见了,只能用GDI+效果测试,见我的软件
    http://huwenjin.com/a/download/byhuwenjin/2010/1209/21.html