2015-09-01 107 views
5

我試圖建立一個透明的窗口,在Windows 10「玻璃」效果這工作直到最近:Windows 10中帶標題欄的模糊窗口?後停止工作Windows更新

Screenshot

我一直在做的是:

  • 塗刷到包括alpha通道的目標DC。在普通GDI中執行此操作的一種方法是使用alpha通道構建圖像,然後使用SRCCOPY將其BitBlt創建到DC。您也可以使用AlphaBlend函數。
  • 然後我使用SetWindowCompositionAttribute(或DwmExtendFrameIntoClientArea)在Windows 10(或更早版本)上啓用模糊。

這一直工作到今天,更新後突然停止工作 - 窗口現在是不透明的。我使用了系統恢復,並且有一天回去了,它實際上再次運行了!任何想法如何解決這個問題?

+0

「由於GDI不支持alpha通道,因此也會將每個像素的alpha值設置爲零。」這不一定是真的;這是一個實現細節。使用每像素alpha創建窗口的常用方法是使用分層窗口並調用UpdateLayeredWindow。 –

+0

@AdrianMcCarthy:當然這是一個無證的實現細節。但是調用SetWindowCompositionAttribute來創建玻璃效果也是如此,所以無論如何我都在無證的土地上。切換到分層窗口將需要重新編寫基於WM_PAINT的代碼,並且我不確定它可以工作(我想要一個不透明的標準標題欄,但是是半透明的內容區域)。此外,自Vista以來的「玻璃」透明度不是基於分層窗口,而是具有Alpha通道的常規窗口(混合由DWM完成)。 – jdm

+1

你知道有什麼方法使用'SetWindowCompositionAttribute'來設置模糊區域(儘可能使用'DwmEnableBlurBehindWindow'),以防止模糊區域在客戶區外? – melak47

回答

3

原來我錯誤地打電話給SetWindowCompositionAttribute。也就是說,其中一個參數有size字段,而我把錯誤的大小寫入。它曾經在某個時間點工作是一個純粹的事故。

+0

你可以擴展這個'size'字段嗎? –

+0

@ charles.milette已經有一段時間了,但函數需要一個指向結構體WINCOMPATTR的指針。在此結構中,您可以指定要設置的屬性,指向新數據的指針以及數據字段的大小。例如:https://github.com/jdmansour/mintty/blob/glass/src/winmain.c#L683 – jdm

+0

哦對。我雖然在談論WINCOMPATTR領域...... –

相關問題