2017-05-16 55 views
4

微軟最近宣佈Acrylic, the glass-like material in Fluent Design。它僅作爲XAML/UWP呈現,但看起來與玻璃非常相似,只是它可以任意着色,並且可以在應用程序中應用於天橋控件以及應用程序的獨立窗口。在Win32應用程序中模仿壓克力

「配方」使其看起來好像是implemented in XAML itself,不會暴露於更廣泛的系統。

Microsoft's recipe for making acrylic: background, blue, blend, tint, noise

一個相關的SO問題confirms this(這是缺乏具體的,技術性的回答,但暗示丙烯酸是無法通過WinAPI的方式玻璃。)

怎麼會有人模仿這一個普通的舊的Win32應用程序?使用玻璃,並混合? (哪些API和what's possible in Win10 Fall Update's glass APIs that was not in Win7?)如果應用程序是使用Win32創建的,但使用DirectX表面進行渲染,是否會打開更多可能性?

+0

[此問題](http://stackoverflow.com/q/43699256/7571258)有一些屏幕截圖,可以更好地展示噪聲影響。 – zett42

回答

2

我認爲可以使用Win32 API來模仿這個,或者至少創建一個接近的結果。

  • 模糊和着色可以使用您已經鏈接的無文檔SetWindowCompositionAttribute()來實現。該功能必須由DWM提供,即使對於XAML實現也是如此。
  • 我不確定排除混合應該做什麼,至少從MS頁面上的縮小的屏幕截圖看,它似乎是微不足道的。
  • 噪音紋理應該很簡單,因爲它可以提供alpha混合...嗯...噪音。使用隨機生成器或者一些perlin noise function

您也可以看看Direct Composition,可能與WS_EX_NOREDIRECTIONBITMAPextended window style相結合,如文章「High-Performance Window Layering Using the Windows Composition Engine」中的說明。我還沒有使用這種技術,但文章指出XAML基於Direct Composition,它應該開放所有的可能性。

+0

DirectComposition是我之前沒有遇到過的東西(在Win10中是否是新的?),並且看起來很順利。謝謝! –

+0

@DavidM DirectComposition是在Windows 8中引入的。 – zett42

4

正如在@ zett42的回答中提到的,我認爲它是使用DirectComposition實現的。微軟推出桌面窗口管理器DWM,它是桌面的合成引擎。使用DWM,窗口繪製到紋理,然後在DWM中進行組合。好處是你可以獲得像3D動畫,透明等奇特效果,並且所有東西都是雙緩衝的,所以你不會得到渲染文物。

DWM最初是基於MIL(媒體集成層),我認爲這是一個場景圖API。有趣的是,當時引入的WPF也使用了MIL。這真的很酷,因爲DWM可以看到WPF窗口的場景圖,以及何時會產生效果,比如放大窗口,它會將其視爲矢量而不是位圖,因此可以在無人爲因素的情況下對其進行縮放。然而,在某些時候,微軟分叉了WPF中使用的MIL版本,並且這種集成失敗了。

快速推進幾年到Windows 8.微軟推出了新的「Metro」應用程序(後來「現代」,現在「UWP」)。引擎蓋下,這些現代應用程序使用一種新的API進行組合,DirectComposition。此API也適用於Win32應用程序,現在它由DWM自身使用。如果你看看公共的DWM函數,那麼與MIL相關的一些函數將被棄用,所以它支持我的理論,即MS從MIL轉向DC。所以,現在我們再次處於初始狀態,應用程序和DWM都使用相同的基礎架構,我們可以輕鬆添加一些有趣的效果。

在某些時候,MS已經爲DirectComposition引入了新的混合效果,由IDCompositionDevice3接口提供。其中包括高斯模糊效果,還有噪音,色調和其他效果。我發現了一種方法,在我的窗口中應用,但我不知道如何將它們應用到我的窗口。不幸的是,我現在無法訪問我的代碼,所以我會在更新時回覆我的答案。

我根據我對文章Efficient Alpha-Blended Windows: DirectComposition的探索。基本上,你有一個對應於屏幕的「設備」和一個對應於你的窗口內容的「視覺」。你必須改變的是:

  • 您的設備可以爲您創建效果。請記住QueryInterface它到IDCompositionDevice3
  • 然後,您可以撥打IDCompositionVisual3致電SetEffect

但是,正如我所說,這隻適用於窗口內容。我認爲必須有一個祕密API來從DWM中獲取當前窗口的父Visual,然後在該Visual上調用SetEffect才能獲得效果。如果某人熟練使用調試器,則應該可以通過跟蹤使用Acyllic效果的UWP應用程序來查找該API。

作爲藍色的鏡頭,我會看看GetWindowCompositionAttribute函數。它最近獲得了一些有趣的冠冕堂皇的旗幟,如WCA_VISUAL_OWNER。

+1

在UWP中,它顯示爲'CreateHostBackdropBrush' - 它確實看起來圍繞着dcomp.dll浮動 - 但唉,MS沒有任何立即計劃將HostBackdropBrush添加到DirectComposition API集](https://github.com/Microsoft/WindowsUIDevLabs/issues/219#issuecomment-305334231)。 :( – melak47