WPF 玻璃窗口后备?

标签 wpf aero aero-glass

创建 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/

相关文章:

c# - 以编程方式取消选择 DataGrid 中的行

WPF 控件模板高度

.net - 在两列中显示项目控件中的项目(WPF)

visual-c++ - WS_EX_LAYERED、不可见窗口和全新安装的 Windows

c++ - Windows 上 Qt 中的无边框窗口支持 native 功能 : aero snap, DWM 调整大小和最小化

winforms - 在 Windows 窗体中仅显示具有透明度的图像?

VS2008 Express 中的 WPF 稳定性

delphi - 扩展 GlassFrame 带来的不良视觉行为

c# - 如何模仿 Windows 7 用户界面?

c# - 如何在像 Office 2010 这样的 WPF 应用程序中对 Aero 玻璃进行渐变淡入淡出?