2010-12-06 44 views
1

我試圖讓一個應用程序的媒體播放器的玻璃效果,但我周圍的所有路障面對。是我,還是API?Windows Vista/7玻璃完全破碎?

我開始撥打:

MARGINS margins = { -1, -1, -1, -1 }; 
HRESULT result = ::DwmExtendFrameIntoClientArea(m_hWnd, &margins); 

和擦除背景黑色:

OnEraseBkgnd 

一切都很好,直到我添加了一個編輯框。使用EditBox,出現黑色文字的地方被玻璃取代。這個問題與ComboBoxEx等更高級的控件不同。那些開始看起來像一團糟。

明亮側這種方法是,alpha混合圖像看起來正常的。並逐漸融入玻璃。

該溶液爲編輯框好像是用與WS_EX_LAYERED和LWA_COLORKEY使用一些可怕彩色玻璃掩蔽,和擦除的背景彩色。不幸的是這打破了其他的事情圖標上的阿爾法混合看起來超級醜陋,陰影與放射性綠色混合,並且玻璃本身變成可點擊的,即使窗口上沒有WS_EX_TRANSPARENT樣式。

第三個建議是用GDI +自定義組合,但這似乎是一個不好的方法,因爲GDI +是一個軟件後備,我找不到如何將EditBox或ComboBoxEx渲染爲圖像的方式稍後可以用於構圖。

我錯過了什麼嗎?

在於是也就來源似乎面臨着同樣的問題: link1 link2

+0

您鏈接的兩個問題似乎與您在此詢問的內容幾乎完全相同。你的問題是什麼:任何人有任何其他想法? – 2010-12-06 15:00:27

+0

這些問題描述了RGB(0,0,0)行爲的一部分,這似乎被破壞了。我還嘗試了通過WinAPI機制進行掩蔽,這些機制仍然不起作用,並導致完全不同但同樣錯誤的結果。所以我仍然想知道是否有人找到了解決方案。 – Coder 2010-12-06 15:07:26

+0

GDI是24bpp是核心問題,玻璃效果需要設置alpha。獅子座的鏈接看起來不錯。 – 2010-12-06 16:00:04

回答

2

簡單的答案是,你不能做到這一點。

所有標準控件呈現自己與正常的GDI調用。普通的GDI呼叫是不知道阿爾法的,並且通常將阿爾法通道設置爲零。

更復雜的答案是,你可以:有在網絡上的一些樣品,其中標準控制與Aero玻璃混合。它們分爲兩個基本類別:

  • WinForms(.NET)示例。 WinForms實際上並不使用本機控件 - WinForms控件是所有重寫的版本,除了其他功能外,使用alpha知道的例程blit。這example是令人沮喪的簡單,讓我意識到微軟討厭本土開發者。

  • 分類樣本:獲取常規/本機控件在航空玻璃上繪製的唯一方法是對控件進行子類化,捕獲WM_PAINT消息以創建DIBBitmap,調用WM_PRINT將控件內容呈現給它。使用DWM函數修復Alpha通道數據。使用AlphaBlend自己繪製生成的alpha'd bitap。

This article on CodeProject包含子類的大部分標準控件的相當不錯的參考實現。

0

嘗試像編輯框的東西「幾乎是黑色的」控制更改文本/前景色(如#010101)。那麼你應該可以跳過除圖像/圖標的alpha透明度之外的其他渲染問題。

編輯:拉絲其他的東西 - 可能是處理兼容性一些奇怪的方法,但再經典的應用程序是不是玻璃默認主題...不知道。如果可能的話,儘量避免自己畫東西。

+1

**這是行不通的。**「幾乎黑色」只會呈現爲「幾乎是玻璃」。 「經典應用程序」是什麼意思?顯然,他正在嘗試開發一款適用於Aero UI的應用程序。在你宣稱它是「經典」之前,他甚至不能把它趕出門外? – 2010-12-06 14:56:45