全屏与无边框窗口

时间:2015-12-25 11:28:46

标签: windows winapi

我的目标是创建一个OpenGL应用程序。我已经看过很多游戏让用户决定游戏窗口是否为#34;将是"全屏"或"无国界"。有什么区别?我如何实现每种方法?

我听说全屏窗口只是具有WS_POPUP样式的窗口,它被设置为屏幕的宽度和高度。这只适用于我上面提到的其中一种方法吗?

"无边框"之间的区别是什么?和"全屏"这里? (截图取自LoL) img

2 个答案:

答案 0 :(得分:5)

您只需要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)

  • 最大化窗口WS_OVERLAPPEDShowWindow(hwnd, SW_MAXMIZE)显示覆盖整个屏幕,不包括任务栏

  • 全屏:WS_POPUP标记,宽度为&高度设置为SM_CXSCREEN / SM_CYSCREEN,覆盖整个屏幕,它遍历任务栏

所有这些窗口都可以WS_BORDER。或者他们可能有WS_THICKFRAME来调整边框大小。在全屏模式下,窗口通常没有边框。在最大化模式下,边框位于视图区域之外。

更多详情:Window Styles

答案 1 :(得分:2)

'全屏'模式是一种特殊模式,游戏接管整个显示器,并且不会尝试以任何方式与其他窗口合作。它是所有游戏过去工作的方式,更灵活(您的游戏分辨率不必与您的桌面分辨率相匹配),理论上更快。在实践中,当你使用alt-tab等时会导致很多问题。在某些情况下,您最终可能仍会显示您应该使用其他应用程序的游戏窗口。

'无边距'制作一个普通窗口,但没有标题栏或边框占据整个屏幕。在视觉上,这应该与全屏相同,但避免了互操作问题。你可以在它上面放置其他东西(例如,taskmanager),你可以非常愉快地使用alt-tab。缺点是它可能会因为Windows参与绘图过程而变慢,并且您仍然坚持使用用户的桌面分辨率。

'加窗'是一个普通的Windows窗口,它总是有一个标题栏,可能有调整大小句柄,最小化按钮等。这可能也会在最大化时占据整个屏幕,但实际可用区域较小,因为您在标题栏/关闭按钮/边框上丢失了一些空间。

屏幕模式通常是Windows级别的东西,而不是openGL。

要获得Windowed模式,您可以使用CreateWindowEx()并传递WS_OVERLAPPED样式。 要获得无边框,您可以使用与WS_POPUP样式相同的函数。无论如何,在理论上。我见过视频驱动程序无论如何都会给你全屏。 要获得全屏,您通常应用ChangeDisplaySettings(blah,CDS_FULLSCREEN)切换到所需的视频模式。