C++ WinAPI:创建没有标题栏的可调整大小的窗口,但带有最小化/最大化/关闭按钮(如Firefox/Chrome/Opera)

C++ WinAPI:创建没有标题栏的可调整大小的窗口,但带有最小化/最大化/关闭按钮(如Firefox/Chrome/Opera),c++,winapi,window,titlebar,C++,Winapi,Window,Titlebar,如果你查看Firefox、Chrome或Opera浏览器的窗口,你会发现它们的窗口 具有最小化/最大化/关闭按钮 可以调整大小 但是没有标题栏 我感兴趣的是:如何创建这样一个窗口 我已经尝试过的: 我在StackOverflow上四处查看(也在谷歌上搜索),发现: 不幸的是,这并没有完全起作用: 第一步是扩展上提出的解决方案 当然,这不会提供最小化/最大化按钮,但另一方面,如果我想要最小化/最大化按钮,我必须: SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBO

如果你查看Firefox、Chrome或Opera浏览器的窗口,你会发现它们的窗口

  • 具有最小化/最大化/关闭按钮
  • 可以调整大小
  • 但是没有标题栏
我感兴趣的是:如何创建这样一个窗口

我已经尝试过的:

我在StackOverflow上四处查看(也在谷歌上搜索),发现:

不幸的是,这并没有完全起作用:

第一步是扩展上提出的解决方案

当然,这不会提供最小化/最大化按钮,但另一方面,如果我想要最小化/最大化按钮,我必须:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);
为什么这种组合似乎是必要的?首先,我可能需要
WS_MAXIMIZEBOX | WS_MINIMIZEBOX
,因为我需要这些按钮

但是如果我设置了
WS\u MAXIMIZEBOX
WS\u MINIMIZEBOX
中的一个,我还必须设置
WS\u SYSMENU
。当我设置
WS\u SYSMENU
时,我还必须设置
WS\u CAPTION
,但这不是我想要的,因为我想避免标题栏(事实上:如果未设置
WS\u CAPTION
,则不会显示最小化/最大化按钮)


那么该怎么办呢?

我相信他们会创建一个普通的窗口,然后用自定义小部件/选项卡在标题栏上画图。这在Firefox中很明显,因为当它挂起时,您可以看到普通的Windows标题栏出现在选项卡上。

您可以创建一个带有或不带标题的窗口-从所需定制的角度来看,任何更合适的方式都可以(即“不带”是您想要做的,如您所说的“不带标题栏”),重要的缺点是你接管了非客户区的绘画工作,这是关键

在这一点上,已经没有人来绘制您的“最小化/最大化”按钮了。然而,这并不意味着您必须从头开始绘制并模仿标准UI。有
DrawFrameControl
和friends API,您可以在其中使用
DFCS\u CAPTIONMIN
参数并为您绘制最小化按钮。您还需要响应其他非客户端区域消息,例如handle
WM\u nchitest
,以告知Windows新窗口按钮的位置

您可能还希望检查以利用启用主题的绘图API,例如
DrawThemeBackground


此活动的一个简单示例是在标题上添加一个附加按钮,如此处所述:。

程序删除非客户端区域(标题栏),并具有一系列自定义处理,用于复制窗口按钮、图标、系统菜单等。其好处是它们可以利用新的“标题栏”,它实际上是标准客户端区域的一部分,添加选项卡或其他自定义控件

以下两篇文章将向您展示如何在Vista及以上版本(使用DWM)上执行此操作:

  • 这一款有一个演示应用程序,显示了许多变体/选项的结果
这是一项非常复杂的工作,因此上面的两篇文章非常有价值。作者一定花了很多功夫在这上面!这两个链接都有在Delphi中编写的示例代码,但是应该很容易将其转换成C++——概念是相同的,只是语法。
你可能也对它感兴趣,因为它都是密切相关的。您将看到该列表中包含的上述两个链接:)

Hmm,我真的不认为这是真的。正常的、所有者绘制的windowm使用自定义绘图在正常的标题栏上绘制。如果有疑问,请查看源代码,它毕竟是开源的。主题API是实现这一点的方法,但这很容易说,而且很难将其全部放在一起。是的。只要您不再需要为自己绘制它,您就必须付出相当大的努力使它看起来与标准UI一致。非常有用。我相信,你和罗曼·R都会赢得“回答”的旗帜。不幸的是,我只能给你们中的一个-(此方法在windows 10上不起作用
SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);