MFC 利用掩码颜色使窗口透明后,将窗口SetWindowPos为别的程序的子窗口后,掩码颜色失效

先设置掩码颜色,使窗口透明化,控件不透明。然后SetWindowPos设置为别的窗口的子窗口,这时,整个窗口都不见了,估计是全透明了。如果先不透明化,先SetWindow... 先设置掩码颜色,使窗口透明化,控件不透明。然后SetWindowPos设置为别的窗口的子窗口,这时,整个窗口都不见了,估计是全透明了。

如果先不透明化,先SetWindowPos到别的窗口作为子窗口之后,再设置掩码颜色使窗口透明化的时候,窗口没办法透明化。

这是怎么回事???
展开
 我来答
归悦欣cf
2015-01-12 · TA获得超过1443个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1318万
展开全部
MFC 利用掩码颜色使窗口透明只对toplevel窗口有效,对子窗口无效。要使得子窗口透明的另想办法。
更多追问追答
追问
又没有别的好方法可以推荐推荐的
追答
子窗口的透明和主窗口完全不同,   主窗口是通过layeredwindow实现的,   而子窗口则必须自己实现,   尤其是半透明,   必须自己对获取的透明背景图进行操作。   要实现子窗口的透明需要做到下面几步: 

1. windows的ExStyle中需要包含WS_EX_TRANSPARENT属性
2. windows的Style中要去掉WS_CLIPSIBLING属性
3. 对继承自windows标准控件的子窗口( 比如edit, scrollbar等等 ), 需要截获WM_CTLCOLORxxx消息并返回一个style为BS_HOLLOW的brush的handle(即一个透明画刷的handle)
4. 需要截获WM_ERASEBKGND消息并不要清除背景(如果做到了3, 则这一步可以省略)
5. 最关键的一点(也是很多人没有想到或不知道的), 必须将parent窗口style中的WS_CLIPCHILDREN标志去掉, 否则PARENT窗口重画时不会重画被子窗口覆盖的部分.
6. 做到以上各步后, 在子窗口收到WM_PAINT消息时就可以获得完整的背景图了, 接下去对这背景进行处理就可以实现半透明效果.

另外一点, 最好同时截获parent窗的WM_PAINT消息, 在parent窗重画前调用InvalidateRect让本子窗口显示实效, 这样子窗口才能同样也收到一个WM_PAINT消息( 这样做是为了保险, 因为我不是很确定主窗口重画系统是否会自动给具有WS_EX_TRANSPARENT属性的子窗口同样发WM_PAINT ).
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式