Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不可见的分层窗口中半透明地绘制_C++_Windows_Winapi - Fatal编程技术网

C++ 在不可见的分层窗口中半透明地绘制

C++ 在不可见的分层窗口中半透明地绘制,c++,windows,winapi,C++,Windows,Winapi,我的目标是拥有一个全屏覆盖的不可见“画布”,我可以在上面使用win32的各种绘图功能进行绘图 我目前尝试的方式是: WNDCLASSA myclass = { 0 }; myclass.lpfnWndProc = WindowProc3; myclass.hInstance = GetModuleHandle(0); myclass.lpszClassName = "MyCanvas"; myclass.hbrBackground = CreateSolidBrush(0xFEEDBEEF);

我的目标是拥有一个全屏覆盖的不可见“画布”,我可以在上面使用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);

虽然这是一幅画布,但经过数小时的谷歌搜索,我仍然无法半透明地在上面画画

在我写这篇文章的时候,我已经添加了我的程序当前显示的屏幕截图。例如,我希望能够将右上角的黑框(用
矩形绘制)设置为半透明,以显示其下方的stackoverflow页面内容

这是一个我发现很有希望的问题,但最终的文本只是背景颜色
((COLORREF)0xFEEDBEEF)
和文本颜色的混合组合。我发现的其他东西要么使元素完全不可见,要么什么也不做,要么需要一些类似MFC的库。如果可能的话,我想只使用win32函数,因为我希望能够实现尽可能高的FPS

我不在乎它是否能在所有Windows版本上运行,只要它能在7到10版本上运行


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

如果您需要定义每像素的透明度,这是一种方法

为此,您必须创建并选择一个32bpp的位图。您可以使用来简化任务。陈雷蒙对此有自己的看法

您可以在内存DC中进行绘制,但不能使用大部分GDIAPI进行绘制,因为GDI忽略了alpha通道(透明度)。我建议使用它来指定alpha值

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

可能影响的说明:


请注意上一个示例中形状的抗锯齿边缘和透明度渐变。诸如此类的事情只有在
UpdateLayeredWindow()

有很多好信息的情况下才能实现,谢谢。我会尽可能快地按照您所说的使用
UpdateLayeredWindow
。你能详细说明一下如何使用
SetLayeredWindowAttributes
来影响矩形区域吗?@Lupe我添加了一些图像来进行说明。我已经开始工作了。非常感谢!一旦我有了一个好的例子,我就会添加工作代码。在这里,你可以看看这篇文章:我不会在这里发布代码,因为我太懒了,以至于在阅读并实现了我写的代码之后,我懒得去回顾和压缩它。@enhzflep当我意识到我使用的
SetLayeredWindowAttributes
只正确了一半时,我非常兴奋,但不久之后我意识到你似乎只能有一个颜色键(也就是说,不可能同时让背景不可见和半透明元素都存在)。我可能在这方面有错,但我不这么认为。:((((((()所示代码绘制了一个圆形时钟面。该圆形外的矩形窗口部分完全透明(颜色键控),而其余所有文本都具有相同的透明度级别-此透明度级别可以从0%到100%不等-即,可以使所有绿色文本都是半透明的(但所有文本都具有相同的透明度级别)。希望这就是你感兴趣的。如果做不到这一点,你必须胡乱地复制你身后的窗口,自己用预乘的alpha执行透明效果-可能,但不完全有趣。;“我发现的其他东西[…]需要一些像MFC这样的库。”-那么,这就是你的答案。MFC是一个围绕Windows API的资源管理包装器。如果你需要Windows API代码,就从那里撕下它。MFC不像是一个神奇的工具,它可以做的比操作系统通过其API提供的更多。此外,你可以将颜色键控和alpha透明度结合起来(
LWA|alpha | LWA COLORKEY
)。这是每个窗口的属性。但是,您不能将其限制在子区域。您使用(0xFEEDBEEF)的目的是什么?COLORREF的高阶字节通常必须为0(只有非常特定的例外情况)。
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);
SetLayeredWindowAttributes( hwnd, 0, 176, LWA_ALPHA ); 
SetLayeredWindowAttributes( hwnd, colorkey, 0, LWA_COLORKEY ); 
SetLayeredWindowAttributes( hwnd, colorkey, 176, LWA_ALPHA|LWA_COLORKEY ); 
UpdateLayeredWindow( ... )