Windows 全屏与无边框窗口

Windows 全屏与无边框窗口,windows,winapi,Windows,Winapi,我的目标是创建一个OpenGL应用程序。我看过很多游戏,让用户决定“游戏窗口”是“全屏”还是“无边界”。有什么区别?如何实现每种方法 我听说全屏窗口只是带有WS_弹出式风格的窗口,设置为屏幕的宽度和高度。这是否仅适用于我上面提到的其中一种方法 这里的“无边界”和“全屏”有什么区别?(截图取自LoL) 您只需WS\u弹出窗口和全屏宽度和高度即可隐藏任务栏。以下是在显示窗口后更改窗口样式的示例: if (msg == WM_LBUTTONDOWN) { if (GetWindowLongPt

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

我听说全屏窗口只是带有WS_弹出式风格的窗口,设置为屏幕的宽度和高度。这是否仅适用于我上面提到的其中一种方法

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

您只需
WS\u弹出窗口
和全屏宽度和高度即可隐藏任务栏。以下是在显示窗口后更改窗口样式的示例:

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);
窗口要么是
WS\u重叠的
WS\u弹出窗口
,要么是
WS\u子窗口
。这三个标志不能相互组合,但它们可以与其他
WS_XXXX
标志组合

顶部窗口是重叠的或弹出的,主窗口的不同样式包括:

  • 正常窗口:
    WS\u重叠
    ,与
    ShowWindow(hwnd,SW\u-SHOW)一起显示

  • 最大化窗口:
    WS\u重叠
    ,与
    ShowWindow(hwnd,SW\u MAXMIZE)一起显示
    覆盖整个屏幕,不包括任务栏

  • 全屏:
    WS\u POPUP
    标志,宽度和高度设置为
    SM\u CXSCREEN
    /
    SM\u CYSCREEN
    ,覆盖整个屏幕,它覆盖任务栏

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


更多详细信息:

全屏模式是一种特殊模式,游戏将占据整个屏幕,不会试图以任何方式与其他窗口合作。这是所有游戏的工作方式,更灵活(游戏分辨率不必与桌面分辨率匹配),理论上更快。实际上,当您使用alt-tab之类的键时,可能会导致很多问题。在某些情况下,当您应该使用其他应用程序时,游戏窗口仍会显示

“无边框”是一个普通窗口,但没有占据整个屏幕的标题栏或边框。在视觉上,这应该与全屏相同,但避免了互操作问题。你可以有其他的东西在上面(例如taskmanager),你可以很高兴地替换tab。缺点是,它可能会慢一些,因为Windows参与了绘图过程,并且您被用户的桌面分辨率所困扰

“Windowed”是一个普通的Windows窗口,它总是有一个标题栏,并且可能有大小调整手柄、最小化按钮等。最大化时,这可能会占用整个屏幕,但实际可用区域较小,因为标题栏/关闭按钮/边框会失去一些空间

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

要获得窗口模式,请使用CreateWindowEx()并传递WS_重叠样式。 要实现无边界,请使用与WS_弹出式相同的函数。不管怎样,从理论上讲。我见过视频驱动程序给你全屏显示。
要获得全屏显示,您通常会应用ChangeDisplaySettings(布拉赫、CD_全屏)切换到所需的视频模式

一个全屏OpenGL窗口是无边界的,这是与任务栏重叠的唯一方式。唯一的区别是尺寸:)我不明白。全屏和无边框都有屏幕尺寸的大小。你能进一步解释一下吗?看来你是在问一个特定的游戏。这取决于他们如何定义全屏、窗口和无边界。我见过许多游戏使用这种方法。LoL不是唯一一个。谢谢,但这并不能完全回答我的问题。我编辑了我的问题,你能检查一下吗?我不知道用于游戏窗口的术语。一个窗口的显示方式只有这么多,我添加了更多关于窗口样式的详细信息的链接。这可能是相关的吗?不,
更改显示设置
与您在桌面上通过“高级显示设置”看到的内容相同。我认为DirectX和OpenGL为此有特殊的功能(
SetDisplayMode
)。这可能与: