【问题标题】:WinAPI: Create resizable window without title bar, but with minimize/maximize/close buttons (as Firefox/Chrome/Opera)WinAPI:创建没有标题栏的可调整大小的窗口,但带有最小化/最大化/关闭按钮(如 Firefox/Chrome/Opera)
【发布时间】:2011-12-02 03:35:12
【问题描述】:

如果您查看浏览器 Firefox、Chrome 或 Opera 的窗口,您会注意到它们的窗口

  • 具有最小化/最大化/关闭按钮
  • 可调整大小
  • 但没有标题栏

我很感兴趣:如何创建这样的窗口?

我已经尝试过的:

我在 StackOverflow 上环顾四周(也用 Google 搜索过),发现了这个:opening a window that has no title bar with win32

不幸的是,这并没有完全帮助:

第一步是扩展opening a window that has no title bar with win32上提出的解决方案

hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER, 
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  NULL, NULL, hInstance, NULL);

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX);
// See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx
SetWindowPos(hWnd, 0, 
   0, 0, 0, 0, // Position + Size
   SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

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

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);

为什么这种组合似乎是必要的?首先我可能想要WS_MAXIMIZEBOX | WS_MINIMIZEBOX,因为我想要这些按钮。

但是http://msdn.microsoft.com/en-us/library/ms632600.aspx 表示如果我设置WS_MAXIMIZEBOXWS_MINIMIZEBOX 之一,我还必须设置WS_SYSMENU。当我设置WS_SYSMENU 时,我还必须设置WS_CAPTION 但这不是我想要的,因为我想避免标题栏(实际上:如果WS_CAPTION 未设置,则不会显示最小化/最大化按钮)。

那该怎么办呢?

【问题讨论】:

  • 此方法不适用于 windows 10

标签: c++ winapi window titlebar


【解决方案1】:

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

【讨论】:

  • 嗯,我真的不认为这是真的。
  • 正常,所有者绘制的windowm使用自定义绘图在正常的标题栏上进行绘制。如有疑问,请查看源代码,毕竟它是开源的。
【解决方案2】:

您可以创建一个带或不带标题的窗口 - 从所需自定义的角度来看更合适的任何一个(即“没有”是您想要“没有标题栏”),以及重要的重要的是你接管了非客户区的绘画——这是关键。

此时,已经没有人可以绘制您的最小化/最大化按钮了。然而,这并不意味着您必须从头开始绘制并模仿标准 UI。有DrawFrameControl 和朋友API,您可以在其中使用DFCS_CAPTIONMIN 参数并为您绘制最小化按钮。您还需要回复其他非客户区消息,例如处理 WM_NCHITTEST 告诉 Windows 你的新窗口按钮在哪里。

您可能还想检查 Visual Styles Reference 以利用支持主题的绘图 API,例如 DrawThemeBackground

此活动的一个简单示例是在标题上添加一个附加按钮,如下所述:CCaptionButton (buttons for the titlebar)

【讨论】:

  • 主题 API 是执行此操作的方法,但说起来容易,很难将它们放在一起。
  • 是的。只要您不再为您绘制它,您就必须付出相当大的努力使其看起来与标准 UI 保持一致。
【解决方案3】:

这些程序删除了非客户区(标题栏),并有一堆自定义处理来重现窗口按钮、图标、系统菜单等。这样做的好处是它们可以绘制到新的“标题栏” ",这实际上是标准客户区的一部分,添加选项卡或其他自定义控件。

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

这件事做起来很复杂,所以上面的两篇文章是无价的。作者一定是下了不少功夫!两个链接都有用 Delphi 编写的示例代码,但应该很容易将其转换为 C++ - 概念相同,只是语法。

您可能还对general resources on Glass and DWM 感兴趣,因为它们都密切相关。您会发现该列表中包含上述两个链接:)

【讨论】:

  • 非常有帮助。我相信,你和 Roman R.both 都会赢得“已回答”的旗帜。不幸的是,我只能把它给你们中的一个。 :-(
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2022-11-11
  • 2010-09-25
  • 2012-12-16
  • 2014-04-20
相关资源
最近更新 更多