0

所以这里是一个小而易读的 MFC 示例。但是它的背景是一个实心图像;我想知道如何创建一个透明的 PNG 作为应用程序背景?

4

1 回答 1

1

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

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

Windows Vista 引入了桌面窗口管理器,它在绘制窗口之前组合窗口以启用桌面 Alpha 效果。使用 DWM API 获得 alpha 效果不像 PNG 那样可定制,但仍然很有吸引力。

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

具有讽刺意味的是,.NET WinForms 应用程序,表面上看起来只是简单地包装了标准的 windows 通用控件,但实际上所有的标准控件都针对 .NET 进行了重新开发,并且它们在放置在 windows 的“玻璃”区域时可以正确绘制。

于 2012-04-14T15:08:20.263 回答