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

时间:2011-10-06 10:25:52

标签: c++ winapi window titlebar

如果您查看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未设置,则不最小化/最大化按钮显示)。

那该怎么办?

3 个答案:

答案 0 :(得分:13)

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

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

这是非常复杂的做法和正确的,因此上述两篇文章是非常宝贵的。作者必须在他们身上投入大量的精力!这两个链接都有用Delphi编写的示例代码,但它应该很容易将其转换为C ++ - 概念是相同的,它只是语法。

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

答案 1 :(得分:6)

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

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

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

此活动的一个简单示例是在标题上添加一个按钮,如下面详细描述的那样:CCaptionButton (buttons for the titlebar)

答案 2 :(得分:0)

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