创建 Glass 窗口就像在 WPF 中调用 DwmExtendFrameIntoClientArea 一样简单,但这只是技巧的一半。如果你禁用 aero,并获得类似 XP 的皮肤,那就是痛苦开始的地方:
在 XP(或禁用 aero)中,您必须调用 DrawThemeBackground 才能获得“透明的感觉”,Internet Explorer 也在其顶部执行此操作,尝试禁用 aero 并查看。
我已经编写了只是执行此操作的应用程序,fallback gracefully when Aero is disabled in Windows.Forms.
问题:但是在 WPF 中执行此操作有所不同,OnRender(相当于 Avalon 中的 OnPaint)为您提供 DrawingContext,如何通过 DrawThemeBackground WINAPI 调用来绘制它?
最佳答案
嗯,DrawThemeBackground
需要一个设备上下文句柄,这是一个纯粹的 Win32 概念...WPF 不使用设备上下文或窗口句柄。但是,WPF 应用程序托管在 Win32 窗口中,您可以检索该窗口的 HWND:
using System.Windows.Interop;
...
IntPtr hwnd = new WindowInteropHelper(this).Handle;
然后您可以使用 GetDC API 获取此窗口的 DC:
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);
...
IntPtr hdc = GetDC(hwnd);
然后您应该能够将 DrawThemeBackground
与此 DC 结合使用。
请注意,这纯粹是理论上的,我没有测试过......
关于WPF 玻璃窗口后备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513371/