对话框透明及半透明问题

时间:2022-05-24 06:05:20
之前在网上搜对话框透明的相关问题,很多人都推荐SetLayeredWindowAttributes函数,可以整体透明或者使用掩码透明部分。我估计它的原理就类似于先把整个窗体该怎么画就怎么画,然后去掉跟掩码相同的颜色。这就出现了一个问题:如果你想实现半透明的话就没辙了。举个例子
对话框透明及半透明问题
如上图,其中A是不透明的区域;B区域想达到的目的是:显示对话框后面的那片区域(即透明),但是在此基础上蒙灰;C是完全透明的区域。
选择一视同仁的方法肯定是不行的,所以似乎可以选择掩码的方式。于是我本打算用一个png图,图片也是窗口这么大,A不透明,B半透明,C透明。但是显示的时候一直都只有C透明,A、B都不透明了。我本来以为是图片问题,但是无论怎么改图都不行,于是我就有了以上对SetLayeredWindowAttributes工作原理的猜想,如此一来就都能解释了。
B区域本来是背景色,理应被刷透明,但是图片中的B画上去之后就改变了B的颜色,导致B跟背景色有区别了,所以B实现不了半透明,而是不透明。
说到这估计大家也明白我想干什么了,可有大神有解? 对话框透明及半透明问题

6 个解决方案

#1


可以半透明.
在XP下唯一方法:给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow
参考: http://blog.csdn.net/cometnet/article/details/6561912
    http://blog.csdn.net/cometnet/article/details/6969019

VISTA/WIN7多一个选择: 使用DWM实现Aero Glass效果


sign -----------------------------------------------------------------------
对话框透明及半透明问题
对话框透明及半透明问题

#2


沙发说的对UpdateLayeredWindow
这个函数可以半透明 。。但是都需要自己画

#3


引用 1 楼 CometNet 的回复:
可以半透明.
在XP下唯一方法:给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow
参考:http://blog.csdn.net/cometnet/article/details/6561912
 http://blog.csdn.net/cometnet/article/details/6969019……

刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……

#4


引用 2 楼 qq6648208281 的回复:
沙发说的对UpdateLayeredWindow
这个函数可以半透明 。。但是都需要自己画

说实在的,这种方式有点难以驾驭啊~ 对话框透明及半透明问题

#5


引用 3 楼 Oearth 的回复:
刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……

1.鼠标事件是没问题的,你可以参考我发的源码
2.PNG最好是32位的


sign -----------------------------------------------------------------------
对话框透明及半透明问题
对话框透明及半透明问题

#6


引用 5 楼 CometNet 的回复:
引用 3 楼 Oearth 的回复:刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……
1.鼠标事件是没问题的,你可以参考我发的源码
2.PNG最好是32位的


sign-……

我把你的代码修改了一下,然后用8位的png图片替代你的图片,发现能正常显示,所以现在我打算学习一下你的代码来实现那个效果,感谢~结贴给分~

#1


可以半透明.
在XP下唯一方法:给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow
参考: http://blog.csdn.net/cometnet/article/details/6561912
    http://blog.csdn.net/cometnet/article/details/6969019

VISTA/WIN7多一个选择: 使用DWM实现Aero Glass效果


sign -----------------------------------------------------------------------
对话框透明及半透明问题
对话框透明及半透明问题

#2


沙发说的对UpdateLayeredWindow
这个函数可以半透明 。。但是都需要自己画

#3


引用 1 楼 CometNet 的回复:
可以半透明.
在XP下唯一方法:给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow
参考:http://blog.csdn.net/cometnet/article/details/6561912
 http://blog.csdn.net/cometnet/article/details/6969019……

刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……

#4


引用 2 楼 qq6648208281 的回复:
沙发说的对UpdateLayeredWindow
这个函数可以半透明 。。但是都需要自己画

说实在的,这种方式有点难以驾驭啊~ 对话框透明及半透明问题

#5


引用 3 楼 Oearth 的回复:
刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……

1.鼠标事件是没问题的,你可以参考我发的源码
2.PNG最好是32位的


sign -----------------------------------------------------------------------
对话框透明及半透明问题
对话框透明及半透明问题

#6


引用 5 楼 CometNet 的回复:
引用 3 楼 Oearth 的回复:刚刚试了一下UpdateLayeredWindow,出现了两个问题,一是不响应鼠标事件了,即使是标题栏;二是图片显示出问题了,给人的感觉就是对话框的内容跟对话框背后的背景出现了对应像素值相加的情况,不知道是不是因为我的png图片是8位的……
1.鼠标事件是没问题的,你可以参考我发的源码
2.PNG最好是32位的


sign-……

我把你的代码修改了一下,然后用8位的png图片替代你的图片,发现能正常显示,所以现在我打算学习一下你的代码来实现那个效果,感谢~结贴给分~