2009-10-03 106 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