[英]Borderless Window Using Areo Snap, Shadow, Minimize Animation, and Shake
我在Windows上使用無邊框窗口創建應用程序。 但是,由於窗口是無邊框的,我沒有陰影,快照,最小化動畫或抖動。 我環顧四周,發現沒有解釋如何實現這一點的網站。 但是,我知道這是可能的,因為Office 2013,Visual Studio 2012和Steam都具有這些功能並且是無邊界的。 我專門使用QT和C ++但是如果你已經為另一個窗口庫解決了這個問題,我也想聽聽你的解決方案。 無論是。 並且通過areo陰影,我不是指兩側的陰影,我的意思是所有活動的原生areo windows應用程序的所有面上的發光陰影。
在使用Spy ++檢查Steam的窗口(它的窗口樣式,它如何回復窗口消息)並嘗試匹配它所做的一切之后,結合這個C#無邊框窗口行為的DWMAPI調用,我相信我弄明白了。
要隱藏窗口的邊框,請在WindowProc中處理WM_NCCALCSIZE
消息:
case WM_NCCALCSIZE: {
if (window->is_borderless) {
return 0;
} else {
return DefWindowProc(hwnd, msg, wparam, lparam);
}
}
要啟用陰影,您需要做的就是:
MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);
要將其關閉,請恢復默認邊距MARGINS windowed = {0,0,0,0};
。 也許扔進一個SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_NOSIZE | SWP_NOMOVE );
另外,要確保重繪框架。
但是,這似乎不適用於所有窗口樣式,顯然您的窗口樣式不能包含標題欄。 標題欄工作正常,添加一個似乎可以啟用最小化動畫。
我得到陰影的最簡單的窗口樣式是WS_POPUP | WS_THICKFRAME
WS_POPUP | WS_THICKFRAME
,也可以獲得aero快照,最大化,最小化和平滑最小化我使用的動畫WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION
WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION
WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION
。
通過DwmSetWindowAttribute
更改DWMWA_NCRENDERING_POLICY
或DWMWA_ALLOW_NCPAINT
似乎不是必需的,默認設置似乎有效。
需要注意的一點是: DwmExtendFrameIntoClientArea
正如名稱所示,所以如果您將帶有Alpha通道的圖像直接繪制到客戶區(例如使用opengl,direct3d / 2d),則可以通過它看到一個小框架:
因此,您可能必須在透明元素后面放置一個非透明的小部件,畫筆或其他東西。
如果一切順利,它應該是這樣的:
這是一個小例子項目 ,F11切換無邊框/窗口模式,F12打開和關閉無邊框陰影。
感謝melak47的回答。
對於正在尋找C ++ / Qt示例的人來說,這個GitHub功能可以像基於melak47代碼的魅力(感謝deimos1877)一樣完成工作! https://github.com/deimos1877/BorderlessWindow
一定要使用visual studio編譯器(> = 2010)來獲取所需的DLL,它應該可以工作。 此示例包括aerosnap支持,無邊框窗口,最小化效果,航空陰影。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.