2009-10-03 108 views
3

创建Glass窗口就像在WPF中调用DwmExtendFrameIntoClientArea一样简单,但这只是诀窍的一半。如果你禁用航空,并获得类似XP的皮肤,那就是痛苦开始的地方:WPF玻璃窗后备?

在XP(或禁用航空)中,您必须调用DrawThemeBackground以获得“透明的感觉”,Internet Explorer也会对其执行此操作顶部,尝试禁用航空,看看。

我已经熟了的应用程序,不只是fallback gracefully when Aero is disabled in Windows.Forms.

问题:但在WPF做不同的是,它的OnRender给你的DrawingContext,如何(OnPaint中当量阿瓦隆。)一个借鉴DrawThemeBackground WINAPI调用?

回答

2

那么,DrawThemeBackground需要一个设备上下文句柄,这是一个纯粹的Win32概念... WPF不使用设备上下文或窗口句柄。然而,一个WPF应用程序托管在一个Win32窗口,你可以检索窗口的HWND:

using System.Windows.Interop; 

... 

IntPtr hwnd = new WindowInteropHelper(this).Handle; 

然后,您可以得到一个DC使用GetDC的API这个窗口:

[DllImport("user32.dll")] 
static extern IntPtr GetDC(IntPtr hWnd); 

... 

IntPtr hdc = GetDC(hwnd); 

然后您应该能够使用DrawThemeBackground与此DC。

请注意,这是所有纯理论的,我没有测试它...

+0

对,这就是我最初尝试也开始油漆等,但我还是没能画到的DrawingContext。我的Aero Glass WPF窗口扩展(之前的一个博客条目)使用类似的技巧,虽然没有处理HDC,但工作得很好。 我认为我们应该尝试改为DrawThemeBackground - > System.Windows.Media.Drawing - > System.Windows.Media.DrawingBrush,并使用DrawingContext.DrawRectangle(ourDrawThemeBackgroundBrush,...)在OnRender覆盖,但我没有包装自己在那附近呢。 – Ciantic 2009-10-05 18:36:12

+0

也许你可以创建一个正确大小的图像,使用Graphics.FromImage获得一个DC,在这个DC上调用DrawThemeBackground并在你的DrawingContext中绘制图像......但我不确定它会如何工作,它可能会导致性能问题 – 2009-10-05 19:53:41

+0

如果我们可以让“干净”的图形对象在哪里绘制,并将其转换为绘图...我会尝试。绘制到现有的图形是一样的,在我的形式的东西,所以这个问题可能归结为将其转换为绘图/ DrawingImage。 – Ciantic 2009-10-05 21:51:20