[英]Draw semitransparently in invisible layered window
我的目標是要有一個全屏覆蓋的不可見“畫布”,我可以使用win32的各種繪圖功能在其上進行繪圖。
我目前正在嘗試的方式是這樣的:
WNDCLASSA myclass = { 0 };
myclass.lpfnWndProc = WindowProc3;
myclass.hInstance = GetModuleHandle(0);
myclass.lpszClassName = "MyCanvas";
myclass.hbrBackground = CreateSolidBrush(0xFEEDBEEF);
myclass.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClassA(&myclass);
...
HWND wnd = CreateWindowExA(WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT, "MyCanvas", 0, WS_POPUP | WS_VISIBLE, 0, 0, screen_width, screen_height, 0, 0, GetModuleHandle(0), 0);
SetLayeredWindowAttributes(wnd, 0xFEEDBEEF, 0, LWA_COLORKEY);
盡管這是一塊畫布,但經過數小時的谷歌搜索,我仍然無法半透明地繪制它。
我添加了一個屏幕快照,該屏幕快照顯示了我編寫此程序時程序當前正在顯示的內容。 我想做的是,例如,使右上角的黑框(用Rectangle
繪制)是半透明的,以顯示其下方的stackoverflow頁面內容。
這是我發現的一個希望,但是生成的文本只是背景顏色((COLORREF)0xFEEDBEEF)
和文本顏色的混合組合。 我發現的其他東西要么只是使元素完全不可見,要么什么都不做,或者需要像MFC這樣的庫。 我只想盡可能使用win32函數,因為我希望能夠獲得最高的FPS。
我不在乎這是否不適用於所有Windows版本,只要它適用於7至10。
如果僅對所有像素具有相同透明度(aka alpha )值或完全透明的矩形區域只需要透明度,則可以將SetLayeredWindowAttributes()
與alpha值和/或顏色鍵結合使用。
如果您需要能夠定義每個像素的透明度,則可以使用UpdateLayeredWindow()
。
為此,您必須創建內存DC並在其中選擇一個32bpp位圖。 您可以使用緩沖的Paint API來簡化任務。 雷蒙德·陳(Raymond Chen)在博客文章中提供了有關此示例的代碼 。
您可以使用內存DC,但是您不能為此使用大多數GDI API,因為GDI會忽略Alpha通道(透明度)。 我建議使用允許您指定Alpha值的GDI + 。
完成繪制到內存DC中的操作后,您將調用UpdateLayeredWindow()
並將該內存DC作為hdcSrc
參數的參數傳遞,以使結果在屏幕上可見。
可能的影響說明:
SetLayeredWindowAttributes( hwnd, 0, 176, LWA_ALPHA );
SetLayeredWindowAttributes( hwnd, colorkey, 0, LWA_COLORKEY );
SetLayeredWindowAttributes( hwnd, colorkey, 176, LWA_ALPHA|LWA_COLORKEY );
UpdateLayeredWindow( ... )
注意最后一個示例中形狀的抗鋸齒邊緣和透明度漸變。 只能通過UpdateLayeredWindow()
實現類似的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.