繁体   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