MFC 利用掩码颜色使窗口透明后,将窗口SetWindowPos为别的程序的子窗口后,掩码颜色失效
先设置掩码颜色,使窗口透明化,控件不透明。然后SetWindowPos设置为别的窗口的子窗口,这时,整个窗口都不见了,估计是全透明了。如果先不透明化,先SetWindow...
先设置掩码颜色,使窗口透明化,控件不透明。然后SetWindowPos设置为别的窗口的子窗口,这时,整个窗口都不见了,估计是全透明了。
如果先不透明化,先SetWindowPos到别的窗口作为子窗口之后,再设置掩码颜色使窗口透明化的时候,窗口没办法透明化。
这是怎么回事??? 展开
如果先不透明化,先SetWindowPos到别的窗口作为子窗口之后,再设置掩码颜色使窗口透明化的时候,窗口没办法透明化。
这是怎么回事??? 展开
1个回答
展开全部
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 ).
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询