如果您查看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_MAXIMIZEBOX
和WS_MINIMIZEBOX
中的一个,我还必须设置WS_SYSMENU
。当我设置WS_SYSMENU
时,我还必须设置WS_CAPTION
但这不是我想要的,因为我想避开标题栏(事实上:如果WS_CAPTION
未设置,则不最小化/最大化按钮显示)。
那该怎么办?
答案 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标题栏。