簡體   English   中英

在不可見的分層窗口中半透明地繪制

[英]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參數的參數傳遞,以使結果在屏幕上可見。

可能的影響說明:

具有LWA_ALPHA的SetLayeredWindowAttributes

SetLayeredWindowAttributes( hwnd, 0, 176, LWA_ALPHA ); 

具有LWA_COLORKEY的SetLayeredWindowAttributes

SetLayeredWindowAttributes( hwnd, colorkey, 0, LWA_COLORKEY ); 

具有LWA_ALPHA | LWA_COLORKEY的SetLayeredWindowAttributes

SetLayeredWindowAttributes( hwnd, colorkey, 176, LWA_ALPHA|LWA_COLORKEY ); 

UpdateLayeredWindow

UpdateLayeredWindow( ... )

注意最后一個示例中形狀的抗鋸齒邊緣和透明度漸變。 只能通過UpdateLayeredWindow()實現類似的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM