全屏vs无边界窗口

我的目标是创build一个OpenGL应用程序。 我见过很多让用户决定“游戏窗口”是“全屏”还是“无边界”的游戏。 有什么不同? 我如何实现每种方法?

我听说全屏窗口只是WS_POPUP风格的窗口,被设置为屏幕的宽度和高度。 这只适用于我上面提到的方法之一吗?

这里“无边距”和“全屏”有什么区别? (来自LoL的截图) IMG

您只需要WS_POPUP和全屏宽度和高度来隐藏任务栏。 窗口已经显示之后,这里是更改窗口样式的示例:

 if (msg == WM_LBUTTONDOWN) { if (GetWindowLongPtr(hwnd, GWL_STYLE) & WS_POPUP) { SetWindowLongPtr(hwnd, GWL_STYLE, WS_VISIBLE | WS_OVERLAPPEDWINDOW); SetWindowPos(hwnd, NULL, 0, 0, 600, 400, SWP_FRAMECHANGED); } else {//show full-screen int w = GetSystemMetrics(SM_CXSCREEN); int h = GetSystemMetrics(SM_CYSCREEN); SetWindowLongPtr(hwnd, GWL_STYLE, WS_VISIBLE | WS_POPUP); SetWindowPos(hwnd, HWND_TOP, 0, 0, w, h, SWP_FRAMECHANGED); } } 

或以初始全屏尺寸显示:

 int w = GetSystemMetrics(SM_CXSCREEN); int h = GetSystemMetrics(SM_CYSCREEN); HWND hmain = CreateWindow(L"className", L"title", WS_POPUP, 0, 0, w, h, 0, 0, hInst, 0); ShowWindow(hmain, SW_SHOW); 

Windows可以是WS_OVERLAPPEDWS_POPUPWS_CHILD 。 这三个标志不能相互组合,但可以与其他WS_XXXX标志组合。

顶窗是WS_OVERLAPPEDWS_POPUP主窗口的不同样式包括:

  • 正常窗口: WS_OVERLAPPED ,用ShowWindow(hwnd, SW_SHOW)

  • 最大化窗口:使用ShowWindow(hwnd, SW_MAXMIZE)显示的WS_OVERLAPPED覆盖整个屏幕,不包括任务栏

  • 全屏显示: WS_POPUP标志,宽度和高度设置为SM_CXSCREEN / SM_CYSCREEN ,覆盖整个屏幕,覆盖任务栏

所有这些窗口可以有WS_BORDER或不。 或者他们可能有WS_THICKFRAME调整边界的大小。 在全屏模式下,窗口通常没有边框。 在最大化模式下,边界落在视野范围之外。

更多细节: 窗口样式