在隐形分层窗口中半透明地绘制

Lup*_*upe 2 c++ windows winapi

我的目标是使用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);
Run Code Online (Sandbox Code Playgroud)

...

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);
Run Code Online (Sandbox Code Playgroud)

虽然这可以作为一个画布,几个小时的谷歌搜索后,我仍然无法透视它.

在我写这篇文章时,我添加了我的程序当前显示的截图.我希望能够做的是,例如,使右上角的黑框(绘制Rectangle)半透明,以便显示它下面的stackoverflow页面内容.

这个问题我发现我很有希望,但结果文本只是背景颜色((COLORREF)0xFEEDBEEF)和文字颜色的混合组合.我发现的其他事情要么让元素完全不可见,什么都不做,要么像MFC那样需要一些库.我想尽可能只使用win32功能,因为我希望能够达到最高的FPS.

我不在乎这是否适用于所有Windows版本,只要它在7到10之间.

目前的问题状态

zet*_*t42 6

如果您只需要透明度为矩形区域,其中所有像素具有相同的透明度(也称为alpha)值或完全透明,则可以使用SetLayeredWindowAttributes()Alpha值和/或颜色键的组合.

UpdateLayeredWindow() 如果你需要能够定义每像素的透明度,那就是你要走的路.

为此,您必须创建内存DC并选择32bpp位图.您可以使用缓冲的绘制API来简化任务.Raymond Chen有一篇博文,里面有一个代码示例.

你可以绘制到内存DC,但你不能使用大多数GDI API,因为GDI忽略了alpha通道(透明度).我建议使用GDI +来指定alpha值.

完成绘制到内存DC后,您将调用UpdateLayeredWindow()并传递该内存DC作为参数的hdcSrc参数,以使结果在屏幕上可见.

可能影响的插图:

SetLayeredWindowAttributes与LWA_ALPHA

SetLayeredWindowAttributes( hwnd, 0, 176, LWA_ALPHA ); 
Run Code Online (Sandbox Code Playgroud)

SetLayeredWindowAttributes与LWA_COLORKEY

SetLayeredWindowAttributes( hwnd, colorkey, 0, LWA_COLORKEY ); 
Run Code Online (Sandbox Code Playgroud)

SetLayeredWindowAttributes与LWA_ALPHA | LWA_COLORKEY

SetLayeredWindowAttributes( hwnd, colorkey, 176, LWA_ALPHA|LWA_COLORKEY ); 
Run Code Online (Sandbox Code Playgroud)

UpdateLayeredWindow

UpdateLayeredWindow( ... )
Run Code Online (Sandbox Code Playgroud)

请注意最后一个示例中形状的抗锯齿边缘和透明度渐变.这样的事情才有可能UpdateLayeredWindow().