【发布时间】: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.