WS_EX_TOOLWINDOW 工具窗口无法按预期工作

Posted

技术标签:

【中文标题】WS_EX_TOOLWINDOW 工具窗口无法按预期工作【英文标题】:WS_EX_TOOLWINDOW tool windows doesn't work as expected 【发布时间】:2019-06-03 04:32:18 【问题描述】:

在我们的旧代码中,使用的是 Windows 扩展样式 WS_EX_TOOLWINDOW。这基本上是为了显示标题栏较窄。但最近在后来的 winodws 版本中,标题栏没有画成窄。也就是说 WS_EX_TOOLWINDOW 没有给出窄标题栏在较新的 Windows 版本中。缩小标题栏是在单击事件上完成的。如果有其他方法可以实现这一点,请告诉我?

我已经读到我们需要处理 WM_NCCALCSIZE。但是还有其他方法吗?或者如果这是唯一的方法,我如何通过按钮单击来处理它?

代码片段:

HWND hwnd = m_hWnd;
......

DWORD dwStylesEx = ::GetWindowLong( hwnd, GWL_EXSTYLE );

if ( bNarrowTitle == true)

    dwStylesEx |= WS_EX_TOOLWINDOW;

else

    dwStylesEx &= ~WS_EX_TOOLWINDOW;

...

::SetWindowLong( hwnd, GWL_EXSTYLE, dwStylesEx );

【问题讨论】:

请提供minimal reproducible example 。也就是说,向我们展示一些重现问题的代码 我已经提供了代码sn-p。 这几乎不是 MCVE。我有多年的Win32编程经验。我很乐意并有动力调试您的问题。但是您是否认为,如果我只是按原样获取该代码,我是否必须复制到本地 Visual Studio 项目中并突然重现您的问题?可能不是。用 WinMain 编写一个完整的示例程序,显示相同的问题并将其发布。或者至少告诉我你为调试问题所做的一件事,例如验证 API 返回码、使用 WinSpy 验证是否应用了样式等……除非你问了一个好问题,否则你不会得到好的答案. 对不起,我想知道这些的人可以通过查看这段代码来提供帮助。但我会发布整个代码。关于应用样式,当应用样式时我有只有标题栏的问题。其他属性正在更改。所以虽然样式正在应用,但标题栏没有任何效果。 【参考方案1】:

MSDN says:

某些窗口数据被缓存,因此您使用 SetWindowLong 所做的更改在调用 SetWindowPos 函数之前不会生效。 具体来说,如果您更改任何框架样式,则必须调用带有 SWP_FRAMECHANGED 标志的 SetWindowPos 才能正确更新缓存。

【讨论】:

SetWindowPos 已被使用。当应用样式时,我只有标题栏有问题。其他属性正在更改。所以虽然样式正在应用,但标题栏没有任何效果。但 MSDN 说" ..一个工具窗口的标题栏比普通的标题栏要短,并且窗口标题是用较小的字体绘制的.." 您的代码示例没有调用它。确切的大小和样式取决于视觉样式、用户指标和字体。如果图标和最小化/最大化按钮消失,那么它就是一个工具窗口。【参考方案2】:

默认外观无法以任何方式区分它。这表明你只能忍受它。

它可能已经改变,因为如果更小,手指不友好!

参考:WS_EX_TOOLWINDOW doesn't give look I want

正如你所说,处理WM_NCCALCSIZE 可能是处理非客户区大小的唯一方法。

参考:How to set the size of the Non-client area of a Win32 window (native)

【讨论】:

以上是关于WS_EX_TOOLWINDOW 工具窗口无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

从任务栏中隐藏窗口而不使用 WS_EX_TOOLWINDOW

Duilib中创建子窗口后,子窗口销毁的问题

[转]VC中如何实现窗口的隐藏

Win32:是不是可以显示窗口但将其从任务栏中隐藏?

C++ Win32界面编程中的窗口风格要点总结

在Delphi 2010 版本中怎样把程序隐藏,不在任务栏处显示?