调整大小时,使用虚线边框使窗口透明
Posted
技术标签:
【中文标题】调整大小时,使用虚线边框使窗口透明【英文标题】:When resizing, make the window transparent with a dotted-line border 【发布时间】:2021-04-14 18:48:41 【问题描述】:我提前问了这个问题,因为我还没有开始尝试实际的、真正的实现。 Win32 (C++) 被证明是一个巨大的编程痛苦。但是,我的问题是:
我想让我的应用程序的窗口在调整窗口大小时变得完全透明,并带有一个虚线周边。我将如何做到这一点?想一想在调整窗口大小时在 Windows 3/3.1(我相信是这个版本)中发生了什么。一切都变得透明,鼠标移动的地方有一个虚线轮廓,然后它会重新绘制整个内容。这就是我想要实现的目标。
前段时间,我尝试处理WM_(ENTER/EXIT)SIZEMOVE
消息并使用SetWindowLong()
设置WS_EX_TRANSPARENT
扩展样式,但我的窗口变成(无限期)传递,当窗口的焦点被杀死时,它再也无法重新获得焦点。
我是否需要处理像WM_NCLBUTTON(DOWN/UP)
这样的其他消息?我有一个布尔标志来告诉我在调整大小期间何时停止绘图,并且确定我何时调整大小的逻辑工作正常,但我无法让视觉效果正常工作。我不确定实际使用 Win32 API 的哪些部分。我做了一些研究,uxtheme.lib
/.h
似乎很有希望,但我不确定它如何与WM_NCPAINT
一起工作,我一直在(有些)运气下使用它。
编辑
我需要澄清一些事情,以防有人感到困惑或不确定我的意思。我所说的 Windows 3.1/3 调整大小方案的意思是 once WM_ENTERSIZEMOVE
已经发生,窗口(控件、标题、框架)应该完全不可见,并且窗口的非客户端区域的周边应该显示各种虚线轮廓。然后,只有直到调整大小完成,当WM_EXITSIZEMOVE
发生时,整个窗口(控件、标题、框架)应该被完全重绘、更新并返回到其正常的功能状态。如有任何误会,请见谅!
【问题讨论】:
WS_EX_TRANSPARENT
实际上并没有使任何东西透明——它所做的只是改变窗口的绘制顺序。
"我想让我的应用程序的窗口在调整窗口大小时变得完全透明,并带有一个虚线边界" - 为什么要这样做?没有健全的 Windows 应用程序会这样做,尤其是在 Windows 的设置中启用“拖动时显示窗口内容”时。关闭该设置,Windows 本身将自动创建您要求的效果(但全局适用于所有窗口)。
@RemyLebeau 我的应用程序使用了我使用WM_(NC) PAINT, CALCSIZE, ACTIVATE, etc
消息开发的自定义标题和框架,但我无法像原生框架那样平滑地调整大小。我认为这是让它看起来更专业和更精致的好方法,因为它真的很紧张,无法像原生框架那样跟上鼠标。
如果我能弄清楚如何获得流畅的操作,那么我认为我不需要这样做(或其他任何事情),但紧张的边界让我非常困扰,以至于我觉得我的虚线轮廓看起来会很好看。
不是解决方案,而是对症状的解释:The compositor is evil.
【参考方案1】:
我找到了答案…… 找了这么久,终于找到了。这是我找到它的地方! http://www.catch22.net/tuts/win32/docking-toolbars-part-2# - 希望它可以帮助其他人!
事实证明,解决方案相当简单。事实上,所解释的核心概念几乎完全是我的想法,但我只是不知道如何实现它。该解决方案涉及覆盖默认的WM_NCLBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP
(特别是在启动窗口移动时)消息,并绘制一个跟随光标位置的带图案的矩形。然后,之后,调用SetWindowPos
或其他类似的函数来重新定位窗口。
基本上,在调整大小完成之前,阻止 Windows 尝试显示任何相关的图形。然后,并且只有在那时,才能让 Windows 将整个窗口一举移动。
【讨论】:
【参考方案2】:根据 Remy 的评论,有一个全局选项和相应的注册表设置,所以也许尝试在移动开始时设置注册表设置并在移动完成时恢复它。
不幸的是,这不起作用,因为 Windows 似乎只是在重新启动时获取设置,广播 WM_SETTINGCHANGE 也不会触发它,这很遗憾,因为自己做一些操作系统已经实现 do 的事情是状况不佳。
【讨论】:
似乎只有在重启后才能读取标志。 此建议答案的作者是否实施了快速概念验证来观察他们的全局解决方案对局部问题的适用性? PoC 是否按预期工作?是否有任何可观察到的故障?那是你的工作,不是我们的。我们的工作是对贡献进行投票。 @IInspectable 恕我直言,实现 OP 的代码也不是我的工作,当 OP 已经有代码时,他们可以进行简单的测试。正如我上面所说,似乎只有在重新启动后才会读取标志,但我没有把它放在答案中,因为可能有另一个事件触发我没有找到的设置的重新加载。 当您发布答案时,您需要知道它可以解决问题。 PoC 是验证这一点的常用方法。在 Visual Studio 中创建一个标准的 Windows 应用程序实际上只需不到一分钟的时间。再增加 3 分钟来实施您建议的方法,再增加一分钟进行测试。如果您不能投入 5 分钟的时间来验证您的解决方案的适用性,那么您应该发表评论并让其他人从那里获取它。要求已经他们声誉的版主额外投入时间来完成你的工作是一个相当奇怪的询问。 @IInspectable 我在这里已经 12 年了,伙计,我不需要你告诉我该怎么做。暂定答案是一个答案,因此不是评论。以上是关于调整大小时,使用虚线边框使窗口透明的主要内容,如果未能解决你的问题,请参考以下文章