gpt4 book ai didi

c++ - 退出全屏模式后清除屏幕?

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:20 25 4
gpt4 key购买 nike

所以我有一个运行的 OpenGL 应用程序可以在全屏模式和窗口模式之间切换。目前,它通过调整窗口大小和更改样式来实现。

然而,当从全屏模式切换到窗口模式时,它似乎并没有使屏幕无效,这让我在切换后绘制的东西在屏幕上挥之不去。有趣的是,它只在单显示器模式下表现出这种行为。如果我在多个显示器上运行,它就会失效,并清除我的绘图。

我不认为这是一个驱动程序错误,因为它发生在使用两个独立视频卡的两台独立计算机上(尽管不可否认它们都是 nVidia。),我认为我在某处做错了。

我已经尝试了很多方法让 Windows 清除我以前全屏绘图的屏幕,但似乎没有任何效果。 InvalidateRect()、RedrawWindow()、ChangeDisplaySettings()...具体来说:

InvalidateRect(m_hwnd, &rectx, true); // rect being the dimensions of either the screen or my window.
InvalidateRect(HWND_DESKTOP, NULL, TRUE); // Doesn't seem to do anything.
RedrawWindow(NULL, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_UPDATENOW);
ChangeDisplaySettings(NULL, 0);

好吧,实际上,似乎确实有效的一件事是在调整大小之前使用 ShowWindow(hwnd, SW_HIDE)。然而,这暂时失去了焦点,允许其他应用程序获取我的应用程序的输入,这似乎是一个糟糕的方法。我应该注意到,当我看到这种行为时,我并没有进行任何实际的显示模式更改;只是保持全屏的当前分辨率。

我有点不知道哪里出错了。简化代码:

if(m_isFullscreen)
{
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
}
else
{
ChangeDisplaySettings(&m_dmSavedScreenSettings, 0);
}
if(m_isFullscreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor(false);
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
if(m_isRunning) // Because ShowCursor uses a counter to indicate, and windowed mode defaults to cursor on, we don't need to increment the counter and double it being on.
{
ShowCursor(true);
}
}

RECT rect;
rect.left = 0;
rect.top = 0;
if(m_isFullscreen) { rect.right = 1280; } else { rect.right = 640; }
if(m_isFullscreen) { rect.bottom = 1024; } else { rect.bottom = 480; }
AdjustWindowRectEx(&rect, dwStyle, false, dwExStyle);

SetWindowLongPtr(m_hwnd, GWL_STYLE, dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
SetWindowLongPtr(m_hwnd, GWL_EXSTYLE, dwExStyle);
if(m_isFullscreen)
{
MoveWindow(m_hwnd, 0, 0, 1280, 1024, true);
}
else
{
MoveWindow(m_hwnd, 0, 0, 640, 480, true); // windowed
}

差不多就是这样。一些其他支持代码和错误检查,但这就是我正在做的...... dmSavedSettings 在 m_hwnd 从 NULL 分配之前保存,而不是之后。我的初始窗口创建工作正常,全屏工作正常。它只是在全屏后返回窗口化,这就是问题所在。

最佳答案

如果您在窗口类中设置了一个空背景刷,窗口将不会被自动清除。您必须添加一个调用 OpenGL 显示处理程序的 WM_PAINT 处理程序,该处理程序依次清除视口(viewport) (glClearColor) 并重绘。

关于c++ - 退出全屏模式后清除屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com