问题标签 [ws-ex-layered]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - UpdateLayeredWindow、SIZE_RESTORED 和 GetClientRect 问题
我在 MFC 应用程序中设置了一个分层窗口。我已经建立了自己的 CDialog 派生,以允许我自定义窗口呈现方式的各个部分。一切正常,直到我开始担心最小化和最大化。
如果您单击最小化或最大化,则窗口的反应完全符合您的预期(即与不使用分层窗口时完全一样)。但是,当我恢复窗口时,会发生一些非常奇怪的事情。
我的测试窗口的默认客户矩形是 324x102。例如,当我从最小化状态恢复时,传递给 OnSize 的 cx 和 cy 为 994、550。如果我随后执行 GetClientRect(在 OnSize 内),这是为窗口报告的大小。奇怪的是,虽然如果我执行 GetWindowRect 我会得到正确的大小(尽管显然包括我所有的非客户区域)。
有没有人知道这里发生了什么,更重要的是,我如何修复它以便 GetClientRect 报告正确的信息?
提前致谢!
winapi - Win32:如何使阴影尊重非矩形分层窗口?
我通过添加WS_EX_LAYERED扩展样式创建了一个分层窗口:
Windows 将使用黑色作为色度键颜色值。我将留下一个黑色的大边框以使问题变得明显:
构建窗口后,我告诉它使用黑色作为色度键颜色:
现在弹出的分层窗口显示为部分透明:
问题是最后一步。我想使用自 Windows XP 以来可用的CS_DROPSHADOW类样式来创建投影:
出现了投影,但是阴影包围了原来的矩形窗口,并且没有考虑到分层窗口提供的窗口透明度:
有谁知道我在某个地方错过了什么神奇的选项,可以让投影尊重非矩形分层窗口?
出现此问题的另一个示例是当您不包含 6px 填充/边距时。Windows® 主题绘制的提示窗口是非矩形的。这会在窗口透明的地方留下一个小的可见间隙,但不会出现投影:
正如您从 Internet Explorer 的提示中看到的那样,Microsoft 已设法使其工作:
仔细查看 Windowstooltips
类提示窗口。使用SpyXX - 我可以获得它的窗口矩形和类样式:
SpyXX 说:
所以一切都指向窗口本身是 104x20 像素,在窗口本身之外有阴影。(这与 一致CS_DROPSHADOW
。)
接下来我可以查看tooltips
窗口类的样式:
有趣的是,它不使用CS_SAVEBITS
( 0x800
); 这对于小型、短暂的窗口很有用。
它也不使用CS_DROPSHADOW
( 0x20000
)。所以现在我想知道它是如何在自己的窗口之外绘制的?
注意:透明分层窗口被记录为区域的首选技术。
编辑: Windows 2000 出现了分层 Windows。CS_DropShadow 是随 XP 添加的。
windows - 如何在窗外画画?
查看 Windows类提示窗口,我看到它在提示窗口的实际矩形之外tooltips
绘制了阴影。
使用SpyXX - 我可以获得工具提示的窗口矩形和类样式:
您会注意到您看到的投影实际上位于正在绘制的窗口之外。我怎样才能在窗外画一个阴影,同时在窗外?
注意:阴影不是使用标准CS_DROPSHADOW
类样式绘制的。我已经通过实验证实了这一点,并且还可以在SpyXX中查看窗口的类样式;它不使用CS_DROPSHADOW
:
那么我怎样才能在窗外画画呢?
注意:尝试在桌面上绘制 DC 已失效。来自 Greg Schechter 的重定向 GDI、DirectX 和 WPF 应用程序:
在屏幕上绘图和读取 - Baaaad!
最后,由于我们在重定向主题,一个特别危险的做法是写入屏幕,或者通过使用 GetDC(NULL) 并写入,或者尝试做 XOR 橡皮筋线等。有两个写入屏幕不好的主要原因:
它很昂贵……写入屏幕本身并不昂贵,但它几乎总是伴随着从屏幕读取,因为在写入屏幕时通常会执行诸如 XOR 之类的读取-修改-写入操作。从显存表面读取非常昂贵,需要与 DWM 同步,并且会停止整个 GPU 管道以及 DWM 应用程序管道。
这是不可预测的……如果您以某种方式设法到达实际的主节点并对其进行写入,则无法预测您写入主节点的内容将在屏幕上保留多长时间。由于UCE不知道,它可能会在下一帧刷新时被清除,也可能会持续很长时间,这取决于屏幕上还需要更新什么。(无论如何,我们确实不允许直接写入主节点,正因为如此......如果您尝试访问 DirectDraw 主节点,例如,DWM 将关闭,直到访问应用程序退出)
c++ - WS_EX_LAYERED 窗口不接收鼠标事件
我正在编写一个自定义背景非矩形窗口,其中包含位图中的最小化和关闭等按钮。 这是我现在 的代码问题是自定义窗口在悬停在非零 alpha 区域上时不接收鼠标消息。
c# - C#中分层窗口上的alpha混合控件
我有一个带有 WS_EX_LAYERED 扩展样式集的分层表单。我使用 CreateWindowEx(...) API 函数创建了一个子“EDIT”控件;控件在那里,但没有绘制,并且没有任何内容出现在表单上。
我知道在顶部窗口上使用 WS_EX_LAYERED 样式时,不再发送 WM_PAINT 消息,并且两个子控件都不会收到它,因此它不会出现。
请注意表单的不透明度设置为 255,并且使用 UpdateLayeredWindow(...) API 使用透明图像绘制背景。
当我将鼠标悬停在 EDIT 控件上时,会出现文本光标,我可以复制其中的文本。
我想我必须处理的问题是以某种方式使控件接受用户绘画。
我尝试使用与表单相同的技术绘制控件,为此我从表单创建了兼容的 DC,但我不知道这是否可能,我的控件仍未绘制。
如果我为该控件发送 WM_PRINTCLIENT 它应该工作吗?在那种情况下,DC应该是分层的父窗体?我也试过这个,但我无法让它工作。
正常形式:http: //img580.imageshack.us/i/formy.png/
分层形式:http: //img6.imageshack.us/i/layeredform.png/
我的问题是如何让我的编辑控件接受 alpha-blend-user-paint ?如何在分层表单上绘制 alpha 混合控件?
c++ - 分层窗口上的C ++ GDI +绘图图像不起作用
所以我在 SO 上找到了很多关于将图像绘制到分层窗口的代码示例、指南和答案。我尝试使用纯HBITMAP
S 和 WIC 库进行绘图,现在我正在使用 GDI+ 进行绘图(这更简单,似乎更易于使用,到目前为止它已经解决了很多由以下原因引起的错误错误的 WIC 代码)。
我目前卡在UpdateLayeredWindow
. 无论我尝试什么,我都无法让它工作。现在,它返回 87,或ERROR_INVALID_PARAMETER
. 问题是,哪一个是不正确的?我难住了!UpdateLayeredWindow
除了拒绝工作之外,下面的代码似乎是解决方案。
我究竟做错了什么?
这是设置 HDC/位图信息/图形对象的代码。
以上工作正常 - 我逐步完成它并且所有指针都工作。
这是绘制PNG的方法。
拔我的头发!帮助?
编辑:我刚刚决定重新编写对UpdateLayeredWindow
函数的调用,这解决了不正确的参数问题。这是我想出的。但是,它仍然不起作用。我究竟做错了什么?
qt - win32 控件(QWinHost)未绘制在分层(即半透明)小部件(WS_EX_LAYERED)上
我使用 QWinHost 移植了一个 win32 控件,并将其放在分层(半透明)小部件上。当我设置 WS_EX_LAYERED 标志时,win32 移植控件没有发生绘制。
winapi - 在父窗口上绘制带有图像的半透明子窗口
我需要在WS_OVERLAPPED
窗口中制作鸟类动画(如下图)。动画由 8 个图像表示:
图像中的蓝色(即RGB(0, 255, 255)
)必须是透明的(请参见下面的屏幕截图)。
我想使用CreateWindowEx()
(鸟将由分层窗口表示)和WS_EX_LAYERED
参数来做到这一点。不幸的是鸟必须是WS_CHILD
。在Windows 7中混合WS_EX_LAYERED | WS_CHILD
是不合法的:
Windows 8:顶级窗口和子窗口支持 WS_EX_LAYERED 样式 。以前的 Windows 版本仅支持顶级窗口的WS_EX_LAYERED 。
最终效果应该是这样的(我已经画了窗口的背景——唯一的问题是鸟):
我怎样才能达到这个效果?如何在父窗口中为鸟设置动画?
如果您有任何想法如何实现具有透明背景颜色的鸟类动画,请分享。
visual-c++ - WS_EX_LAYERED、隐形窗口和全新安装的 Windows
我想和你分享这篇文章,因为我浪费了很多时间来理解为什么 WS_EX_LAYERED 标志在全新安装的 Windows 上不起作用(我的测试是在 Win7 上,我不知道它是否可以在Win8 操作系统)。
这是我的代码:
然后我想添加一个透明层:
运行代码,窗口从未出现过!这不是子窗口(WS_EX_LAYERED 不适用于子窗口),所以 WS_EX_LAYERED 标志应该有效。
为什么?
c++ - 可以通过 C++ SFML 点击的窗口
好吧,我制作了这个可以正常工作的透明窗口,我将其设置为全屏和最顶部。你甚至看不到它,所以现在我可以在屏幕上画我想要的任何东西!问题是,如果我试图点击它后面的东西,它会聚焦窗口,从而无法点击它后面的任何东西。我的目标是直接点击窗口并保持最高。
我想知道我是否可以使用 windows.h 或 SFML 来做到这一点。
我试过了
但这只会创建一个白色窗口(但我可以点击它)
我试过了
我可以看到它,但我不能再点击它了..