2010-04-19 69 views
5

在我的應用程序中,我使用DWM API的方法DwmExtendFrameIntoClientArea來調整窗體,以擴展Aero Glass標題欄的高度,以便繪製部分表單客戶區在Aero框架上。爲了達到這個效果,我還在客戶區域的一部分上繪製了一個黑色的矩形,這個矩形在玻璃框架的「上方」,因此許多在線文章都表示它看起來很透明。這在Windows Vista/Windows 7下運行得非常好,但是當我下載VS 2010並使用.NET Framework 4.0作爲構建我的應用程序的增強框架時,此方法不再有效。問題在於黑色矩形是可見的,即在Aero玻璃上繪製時黑色不再被認爲是透明的。有沒有人有一個想法,可能是什麼問題,以及如何克服?.NET Framework 4.0和在Aero Glass上的繪圖問題

+0

Aero glass works on Windows 7?我認爲這隻適用於Windows Vista上的DWM。 – Svisstack 2010-04-19 11:40:46

+2

@Svisstack:是的;航空玻璃在Windows 7上工作。 – SLaks 2010-04-19 11:44:11

+0

是的,它的工作原理。什麼不起作用,就像我以前使用早期版本的.NET時所做的那樣(<4.0) – WorldIntruder 2010-04-19 11:46:03

回答

0

請原諒我,如果這是無益的,但它可能只是改變了他們的調色板?很多時候,這些窗口interop類型的API似乎除了默認的調色板之外還可以使用PBGRA調色板,並且它們的默認顏色調色板可能已經從一個框架版本更改爲另一個。它應該很簡單,以測試這是否正確。我發現了一個類似的渲染硬件遊標的問題,在某些情況下,透明和黑色會被混淆,最終結果是我錯誤地計算了PBGRA,所以BGR中的一個比A更大,這可能會對你的背景應該是透明的顏色。)

使用DWM API方法還有其他一些問題。我並不完全確定,但是從記憶來看,設置新邊距有一些複雜性 - 如果我沒有記錯,它們都需要有相同的符號(+/- )或工件(例如突然出現的黑色背景)有時出現。

1

這個問題的答案在這裏描述:http://msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6與解決方案的C#。從鏈接頁面(如果鏈接斷開)

摘錄:

使用玻璃作爲你的窗口上的背景是有點棘手。如果你渲染任何自然不透明的東西(比如GDI函數),你會得到你的物品在玻璃上渲染,儘管有時會出現意想不到的結果。如果您想實際將渲染混合到玻璃表面中,則需要利用利用顏色的Alpha通道(例如GDI +,Windows Presentation Foundation或Windows XP Theme API)的功能。

一個特別的問題是,呈現黑色的GDI項目使用位模式0x00000000-如果您使用的是Alpha通道,這也恰好是完全透明的黑色。這意味着如果您使用黑色GDI筆刷或鋼筆繪畫,您將獲得透明顏色,而不是黑色。這個問題最大的問題是,當您嘗試在位於玻璃區域的文本標籤的控件中使用默認文本顏色時。由於默認的文字顏色通常是黑色的,因此DWM會認爲這是透明的,並且文字將被錯誤地寫入玻璃杯中。

而對於WinForms的解決方案:

令人高興的是,有一些解決此問題的方法。使用所有者繪製控件是一個。呈現到具有Alpha通道的位圖是另一個。幸運的是,讓控件上的文本最簡單的方法是讓.NET Framework 2.0爲您使用GDI +。這很容易通過在控件上設置UseCompatibleTextRendering屬性來完成。默認情況下,此屬性設置爲false,以便爲以前版本的.NET Framework編寫的控件呈現相同的效果。但是,如果您將其設置爲true,那麼您的文字將顯得正確。您可以使用Application.SetUseCompatibleTextRenderingDefault方法全局設置屬性。如果您使用的是VisualStudio®2005,則在創建表單之前,模板代碼將包含調用以在主例程中將兼容的文本渲染設置爲false。您可以編輯它以將其設置爲true,如下所示,並且在玻璃窗口上書寫時,您的所有控件都將看起來正確。

static void Main() 
{ 
    Application.EnableVisualStyles(); 

    Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue 

    Application.Run(new GlassForm()); 
}