问题标签 [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.

0 投票
1 回答
1082 浏览

c++ - UpdateLayeredWindow、SIZE_RESTORED 和 GetClientRect 问题

我在 MFC 应用程序中设置了一个分层窗口。我已经建立了自己的 CDialog 派生,以允许我自定义窗口呈现方式的各个部分。一切正常,直到我开始担心最小化和最大化。

如果您单击最小化或最大化,则窗口的反应完全符合您的预期(即与不使用分层窗口时完全一样)。但是,当我恢复窗口时,会发生一些非常奇怪的事情。

我的测试窗口的默认客户矩形是 324x102。例如,当我从最小化状态恢复时,传递给 OnSize 的 cx 和 cy 为 994、550。如果我随后执行 GetClientRect(在 OnSize 内),这是为窗口报告的大小。奇怪的是,虽然如果我执行 GetWindowRect 我会得到正确的大小(尽管显然包括我所有的非客户区域)。

有没有人知道这里发生了什么,更重要的是,我如何修复它以便 GetClientRect 报告正确的信息?

提前致谢!

0 投票
3 回答
8960 浏览

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 添加的。

0 投票
3 回答
5069 浏览

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 将关闭,直到访问应用程序退出)

0 投票
1 回答
1628 浏览

c++ - WS_EX_LAYERED 窗口不接收鼠标事件

我正在编写一个自定义背景非矩形窗口,其中包含位图中的最小化和关闭等按钮。 这是我现在 的代码问题是自定义窗口在悬停在非零 alpha 区域上时不接收鼠标消息。

0 投票
1 回答
1604 浏览

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 混合控件?

0 投票
1 回答
1846 浏览

c++ - 分层窗口上的C ++ GDI +绘图图像不起作用

所以我在 SO 上找到了很多关于将图像绘制到分层窗口的代码示例、指南和答案。我尝试使用纯HBITMAPS 和 WIC 库进行绘图,现在我正在使用 GDI+ 进行绘图(这更简单,似乎更易于使用,到目前为止它已经解决了很多由以下原因引起的错误错误的 WIC 代码)。

我目前卡在UpdateLayeredWindow. 无论我尝试什么,我都无法让它工作。现在,它返回 87,或ERROR_INVALID_PARAMETER. 问题是,哪一个是不正确的?我难住了!UpdateLayeredWindow除了拒绝工作之外,下面的代码似乎是解决方案。

我究竟做错了什么?

这是设置 HDC/位图信息/图形对象的代码。

以上工作正常 - 我逐步完成它并且所有指针都工作。

这是绘制PNG的方法。

拔我的头发!帮助?

编辑:我刚刚决定重新编写对UpdateLayeredWindow函数的调用,这解决了不正确的参数问题。这是我想出的。但是,它仍然不起作用。我究竟做错了什么?

0 投票
1 回答
707 浏览

qt - win32 控件(QWinHost)未绘制在分层(即半透明)小部件(WS_EX_LAYERED)上

我使用 QWinHost 移植了一个 win32 控件,并将其放在分层(半透明)小部件上。当我设置 WS_EX_LAYERED 标志时,win32 移植控件没有发生绘制。

0 投票
2 回答
1685 浏览

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 。

最终效果应该是这样的(我已经画了窗口的背景——唯一的问题是鸟):

在此处输入图像描述

我怎样才能达到这个效果?如何在父窗口中为鸟设置动画?
如果您有任何想法如何实现具有透明背景颜色的鸟类动画,请分享。

0 投票
2 回答
2384 浏览

visual-c++ - WS_EX_LAYERED、隐形窗口和全新安装的 Windows

我想和你分享这篇文章,因为我浪费了很多时间来理解为什么 WS_EX_LAYERED 标志在全新安装的 Windows 上不起作用(我的测试是在 Win7 上,我不知道它是否可以在Win8 操作系统)。

这是我的代码:

然后我想添加一个透明层:

运行代码,窗口从未出现过!这不是子窗口(WS_EX_LAYERED 不适用于子窗口),所以 WS_EX_LAYERED 标志应该有效。

为什么?

0 投票
0 回答
140 浏览

c++ - 可以通过 C++ SFML 点击的窗口

好吧,我制作了这个可以正常工作的透明窗口,我将其设置为全屏和最顶部。你甚至看不到它,所以现在我可以在屏幕上画我想要的任何东西!问题是,如果我试图点击它后面的东西,它会聚焦窗口,从而无法点击它后面的任何东西。我的目标是直接点击窗口并保持最高。

我想知道我是否可以使用 windows.h 或 SFML 来做到这一点。

我试过了

但这只会创建一个白色窗口(但我可以点击它)

我试过了

我可以看到它,但我不能再点击它了..