无边框窗口和桌面尺寸相同时闪烁

2023-12-23

我正在尝试创建一个充满屏幕的无边框窗口 http://pcgamingwiki.com/wiki/Glossary%3aBorderless_fullscreen_windowed带有 OpenGL 视口。问题是,当我将窗口和视口设置为与桌面大小相同时,窗口在失去和获得焦点、退出和创建时会闪烁黑色。这可能与 Windows 将窗口设置为某种真正的“全屏”模式有关。这似乎不会发生在使用这种类型的无边框全屏窗口的其他应用程序(DirectX?)中。

我相信SFML 有这个问题的一个变体 http://en.sfml-dev.org/forums/index.php?topic=12002.0.

有一个解决方法:不要将窗口设置为桌面的确切大小。例如,使窗口的宽度比桌面的宽度多一个像素。

Below is an SSCCE http://www.sscce.org/ without error checking that shows what I'm talking about. This will create a borderless fullscreen window with a desktop-sized OpenGL viewport displaying an ugly green color (exit with AltF4). You can change the line #define FIX_BUG 0 to #define FIX_BUG 1 which just adds one extra pixel to the window's width to see what the behavior I want looks like.

#define WIN32_LEAN_AND_MEAN
#include "windows.h"

#pragma comment(lib, "OpenGL32.lib")

#define FIX_BUG 0

void MyRegisterClass(HINSTANCE hInstance);
HWND MyCreateWindow(HINSTANCE hInstance);
void MySetupOpenGLContext(HWND hWnd);
void MySetPixelFormat(HDC hDC);
RECT MyGetDesktopRect();
void MyLoadOpenGLFunctions();

#define APIENTRYP APIENTRY *
#define GLAPI extern
#define GL_COLOR 0x1800

typedef int GLint;
typedef int GLsizei;
typedef unsigned int GLenum;
typedef float GLfloat;

typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
PFNGLVIEWPORTPROC glViewport;

typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
PFNGLCLEARBUFFERFVPROC glClearBufferfv;

static const char *windowClass = "CLASS";
static const char *windowTitle = "TITLE";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
    MyRegisterClass(hInstance);
    const HWND hWnd = MyCreateWindow(hInstance);
    MySetupOpenGLContext(hWnd);
    ShowWindow(hWnd, nCmdShow);
    HDC hDC = GetDC(hWnd);

    MSG msg;
    while (IsWindow(hWnd)) {
        while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) DispatchMessage(&msg);

        const GLfloat color[] = {0.5f, 0.5f, 0.0f, 1.0f};
        glClearBufferfv(GL_COLOR, 0, color);

        SwapBuffers(hDC);
    }

    return 0;
}

void MyRegisterClass(HINSTANCE hInstance) {
    WNDCLASSEX wcex = {0};

    wcex.cbSize = sizeof wcex;
    wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcex.lpfnWndProc = &DefWindowProc;
    wcex.hInstance = hInstance;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH) (COLOR_WINDOWFRAME + 1);
    wcex.lpszClassName = windowClass;

    RegisterClassEx(&wcex);
}

HWND MyCreateWindow(HINSTANCE hInstance) {
    RECT dRect = MyGetDesktopRect();
    return CreateWindow(windowClass, windowTitle, WS_POPUP,
                        0, 0, dRect.right + FIX_BUG, dRect.bottom,
                        NULL, NULL, hInstance, NULL);
}

void MySetupOpenGLContext(HWND hWnd) {
    HDC hDC = GetDC(hWnd);
    MySetPixelFormat(hDC);
    HGLRC hGLRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hGLRC);
    MyLoadOpenGLFunctions();
    RECT dRect = MyGetDesktopRect();
    glViewport(0, 0, dRect.right, dRect.bottom);
}

void MySetPixelFormat(HDC hDC) {
    PIXELFORMATDESCRIPTOR pfd = {0};

    pfd.nSize = sizeof pfd;
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.cStencilBits = 8;
    pfd.iLayerType = PFD_MAIN_PLANE;

    int format = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, format, &pfd);
}

RECT MyGetDesktopRect() {
    RECT desktopRect;
    const HWND hDesktop = GetDesktopWindow();
    GetWindowRect(hDesktop, &desktopRect);
    return desktopRect;
}

void MyLoadOpenGLFunctions() {
    glViewport = (PFNGLVIEWPORTPROC) GetProcAddress(GetModuleHandleA("OpenGL32.dll"), "glViewport");
    glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) wglGetProcAddress("glClearBufferfv");
}

Github 要点 https://gist.github.com/matteckert/11016920#file-glborderless-cpp | Raw Text https://gist.githubusercontent.com/matteckert/11016920/raw/7f5770e2f436142965fde716f21bffb4a5f5c80c/glborderless.cpp

为什么会发生这种情况?有没有办法将窗口设置为桌面的确切大小来获得我想要的行为?

我的平台:Visual Studio 2013 / 64位Windows 8 / AMD Radeon HD6850。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无边框窗口和桌面尺寸相同时闪烁 的相关文章

  • 如何在Windows上用C语言实现定时器

    如何在 C 中创建一个计时器 时间到期后 我应该能够调用回调函数 平台是windows 有人可以指导我吗 问候 米敦 看一眼SetTimer http msdn microsoft com en us library ms644906 28
  • Sigar API for JAVA(需要指南)

    我已经下载了 Sigar API http support hyperic com display SIGAR Home http support hyperic com display SIGAR Home 并希望在项目中使用它来获取有关
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 我可以在 C# 进程中使用 SetErrorMode 吗?

    我正在准备写一个在线法官核心 一个可以编译用户代码并运行程序来检查答案的程序 如uva online Judge 我在捕获提交程序的异常时遇到问题 如下所示 int main while scanf d d n m printf d n n
  • Django - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    我正在尝试在 Windows 10 上运行 Django 我是 Django 的新手 我正在使用 Compressor Toolkit 我的问题是 我可以运行 manage py 但本地主机说 base html 第 9 行出错该进程无法访
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • ListView 多选行为?

    Comtl32 dll v6 0中的ListView进行多项选择 使用Shift键时 如下 x表示选择 00xxxx xxxxxx xxxx00 早期版本的 ListView 的做法如下 00xx00 00xx00 00xx00 有没有办法
  • 调试断言失败。表达式(流!=NULL)

    我收到以下错误 调试断言失败 表达式 流 NULL 文件 f dd vctools crty bld self x86 crt src fwrite c 创建 4 个线程时 CPU 使用率 100 该代码最初运行良好一段时间 然后给出此错误
  • 如何取消同步 WinHttp 请求?

    我的服务有一个线程可能正在执行WinHttpSendRequest当有人试图停止我的服务时 The WinHttpCloseHandle 文档 http msdn microsoft com en us library windows de
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 抑制“程序无法启动,因为 X.dll 丢失”错误弹出窗口

    我有一个Python程序 它使用os system来执行各种命令 它不能使用subprocess因为它必须向后兼容到 Python 2 0 在 Windows 上 有时该命令会引用异常目录中的 DLL 因此我会收到臭名昭著的 程序无法启动
  • SC创建binpath错误

    我正在尝试在 PowerShell 中运行以下命令 sc create StrongSwan binpath C Users Kanishk Desktop Strong Strong stronswan strongswan 5 6 3
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • 如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?

    我想编写一个执行以下操作的批处理文件 Check if a service is running 如果正在运行 请退出批处理 如果没有运行 启动该服务 到目前为止 我在谷歌上搜索的代码示例被证明不起作用 所以我决定不发布它们 启动服务是通过
  • 什么是特权指令?

    我添加了一些可以干净编译的代码 并且刚刚收到此 Windows 错误 MonTel Administrator 2 12 7 MtAdmin exe Application Error The exception Privileged in
  • 在远程桌面上使用 Powershell 获取 Windows DisplayLanguage

    我正在尝试通过 powershell 获取 Windows 显示语言设置远程计算机 我尝试了 Get WinUserLanguageList 但这会返回所有语言的列表 Get WinSystemLocale 和 Get Culture 也不
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • Mysql 使用Where 进行选择,如果where 条件不存在则默认

    我有表 Product 和 ProductDetails 在 ProductDetails 中 我有包含多种语言的产品描述的行 按 lang 列区分 并非每个产品都有每种语言的描述 如何进行选择以选择指定语言的描述 通过Where prod
  • 如何根据用户输入的值创建验证范围?

    我想在单元格 A1 中创建一个验证范围 此验证允许用户输入从 1 到 x 的值 而 x 指的是用户在 B1 中输入的值 例如 如果用户在 B1 中输入值100 那么我们只能在单元格 A1 中输入1到100 我想知道如何在 C 中做到这一点
  • 访问 Angular Material 表中的输入字段

    几天来我一直在尝试从角度材质表内的输入字段获取数据 我基本上是用来自 API 的值填充表格 但是每当我们没有获得任何日期时 在我的情况下 课程没有设置预定日期 我会插入一个文本框 其中应显示该值这样用户就可以为该特定课程设置日期 Like
  • Orange Hrm 3.1-向选项卡添加新的菜单标题

    我是 symfony 框架的新手 我使用的是 Orangehrm 3 1 1 我在第二级选项卡中添加了一个新的菜单标题 但我不知道如何导航到特定的 href 链接 请帮我完成步骤 这是我通过数据库添加菜单项的方法 要在 Orangehrm
  • 如何在 Android CalendarView 上仅显示特定月份?

    我想在 CardView 上显示特定月份without下一个和上一个箭头用于导航日历 如果我想显示 2010 年 2 月 用户必须只能看到 2010 年 2 月 他们无法查看下个月或上个月 我跟着this https stackoverfl
  • 通过回溯分割字符串

    我正在尝试编写一个代码 将无空格的字符串分割成有意义的单词 但是当我给出像 arealways 这样的句子时 它返回 a real ways 而我想要的是 are 总是 我的字典包含所有这些词 我怎样才能编写一个不断回溯直到找到最佳匹配的代
  • 在R中绘制图形G=(V,E)

    我想通过 ggplot 或一些 R 内置函数在 R 中绘制标准 G V E 图 我有一个包含顶点坐标的数据框 gt V x y 1 589 3438 6422 883 2 8762 6921 7789 147 3 7973 0883 455
  • 样式显示在 Firefox、Opera、Safari 中不起作用 -(IE7 可以)

    我有绝对的定位div我想在用户单击链接时显示 这onclick链接的调用一个 js 函数 该函数将 div 的显示设置为阻止 也尝试过 inline table cell inline table ETC 这在 IE7 中效果很好 但在我尝
  • 语法高亮显示:Eclipse 如何做到如此快?

    我用 Java 为 Android 开发了一个语法荧光笔 它运行良好 但问题是处理大文件时速度可能会很慢 所以我想知道像 Eclipse 和 Gedit Ubuntu 这样的源代码编辑器如何快速突出显示您刚刚编写的内容 例如 如果您在编写
  • 任何人都知道用 *[class] 标记一个类的目的是什么

    今天我收到了一位客户发来的文件 该文件是电子邮件模板 在移动版本的 css 中 所有类规范均以 class 开头 e g class centertext somespec 0 有人知道将其添加到课程中的目的是什么吗 thanks 有一个雅
  • Base64 编码:非法 Base64 字符 3c

    我正在尝试将 xml 格式的数据解码为字节base64我遇到了问题 我的方法是在java中 它需要一个String数据并将其转换为bytes就像下面这样 String data string of data in xml format by
  • 将 Common Lisp 代码移植到 Clojure

    将 Common Lisp 应用程序移植到 Clojure 有多实用 更具体地说 Common Lisp 中存在哪些 Clojure 中不存在的功能 需要重写 有一个clojure org 上的列表 http clojure org lis
  • Go中如何进行除法运算

    我正在尝试用 Go 进行简单的除法 fmt Println 3 10 这会打印 0 而不是 0 3 这有点奇怪 有人可以分享一下这背后的原因是什么吗 我想在 Go 中执行不同的算术运算 Thanks 二元运算的操作数3 10是无类型常量 规
  • 了解 RTF 并使用 vb.net 进行编辑

    我的 vb net 表单中有这个 RichTextbox 我想当用户单击按钮时 例如加粗所选文本 我将如何执行此操作 另外 我不想使用标准的 vb net 表达式 例如RichTextBox1 SelectedText Font Bold
  • QString 的最大大小

    我在 Ubuntu 16 04 64 位架构上使用 Qt 5 9 我有一个要求 我需要从一个文件中获取输入 该文件的字符范围在 10 8 范围内 不幸的是 将文件分成几部分并进行处理并不是一种选择 因为我需要文件中的全部数据来操作我的代码
  • 如何使用单个 Service Worker 来安装多语言 Angular PWA?

    我已经准备了本地化语言版本的应用程序 为此 我使用了原生 Angular i18n 模块 它准备了两个应用程序包 每个包都有适当的语言 该应用程序的每个版本都可以在我的 nginx 服务器上的单独位置下使用 myapp com en mya
  • Indy 服务器支持 SSL 2,但不应该

    印地德尔福 10 1 柏林 我的客户检查了 HTTPS 连接 使用 Qualys SSL Labs 该报告指出 此服务器支持 SSL 2 以及其他警告 但我猜它们与此相关 使用的代码如下 SSLIOhandler TIdServerIOHa
  • mget 无法像 get 一样获取原始函数

    我可以用get获得原始函数 例如 get Primitive 然而 mget failed mget Error value for not found 为什么 如何解决这个问题 默认为get是使用inherits TRUE 我认为 基于文
  • 获取 ToolStripDropDown 对象的下拉状态

    尽管查看了几次 我在文档中找不到任何返回下拉列表是否打开的简单状态的内容 我想为工具条子菜单创建一个单击事件 该事件将根据其状态打开或关闭项目下拉列表 我可能会忽略它 因为它看起来是一个基本的方法 on the 工具栏下拉菜单 http m
  • 无边框窗口和桌面尺寸相同时闪烁

    我正在尝试创建一个充满屏幕的无边框窗口 http pcgamingwiki com wiki Glossary 3aBorderless fullscreen windowed带有 OpenGL 视口 问题是 当我将窗口和视口设置为与桌面大