MFC:如何使用透明PNG作为背景创建Skinnied对话框(而不是窗口镶边)?

时间:2012-04-14 13:06:10

标签: c++ windows mfc dialog window

所以这是一个感谢small, readable MFC sample。但它的背景是一个坚实的形象;我想知道如何创建一个透明的PNG作为app backround?

1 个答案:

答案 0 :(得分:1)

有两种基本方法可以改变窗口的非客户端(“chrome”)区域。

Layered windows,在Windows XP中引入 - 并允许不同级别的窗口效果。这里的技术是将WS_EX_LAYERED样式添加到窗口 - 这会阻止WM_PAINT(在MFC CWnd::OnPaint中)运行。相反,分层窗口由调用UpdateLayeredWindow的应用程序绘制,提供一个填充了预乘32bpp数据的DIBSection。

Windows Vista引入了Desktop Window Manager,它在绘制窗口之前编写窗口以启用桌面alpha效果。使用DWM API获取alpha效果不像PNG那样可以自定义,但仍然很有吸引力。

这两种技术都会遇到问题,因为子窗口绘制不能识别alpha - 分层窗口根本不会绘制子窗口,因此您需要手动枚举并将所有子控件绘制到屏幕外表面。 DWM窗口会绘制子控件 - 但本机应用程序可用的标准窗口控件都没有被修改为支持alpha。

具有讽刺意味的是,表面上的.NET WinForms应用程序看起来只是简单地包装了标准窗口常用控件,但实际上所有标准控件都已经重新开发用于.NET,并且当它们被放置在窗口的“玻璃”区域时它们正确地绘制