在C++中以可移植的方式获得桌面分辨率

Portable way in C++ to get desktop resolution

本文关键字:方式获 桌面 分辨率 可移植 C++      更新时间:2023-10-16

我正在制作一款C++游戏,我希望它能自动获得用户的桌面分辨率。

到目前为止,我已经找到了仅限windows的解决方案——有没有一种方法/库可以在windows/Mac/Linux上找到分辨率?

有几个库可以帮助您解决底层问题。无论如何,你可能需要在这些平台上更多的东西,所以我会列出一些:

  • SFML是一个C++库抽象了许多I/O内容,包括显示管理。还支持多个平台
  • 经典的SDL虽然是一个C库,但在独立于平台的游戏开发中被广泛使用,并支持多个平台。与SFML一样,它所做的不仅仅是显示管理
  • GLFW,见wardds答案,也是一个C库,也提出了一个抽象层,但更专注于显示器和键盘/鼠标I/O,而不是更广泛的I/O(音频等)

GLFW提供了一种跨平台(适用于Windows、Mac和Linux)的方式来获得桌面视频模式。它是一个C api,但它将在C++中工作相关功能(和文档)在这里:

void glfwGetDesktopMode( GLFWvidmode *mode )

参数

mode指向GLFWvidmode结构的指针,该结构将由函数填写。

返回值

模式所指的GLFWvidmode结构用桌面视频模式填充。

描述

此函数以GLFWvidmode结构返回桌面视频模式。参见glfwGetVideoModes用于CCD_ 7结构的定义。

票据

桌面显示器的颜色深度总是以每种颜色的位数报告组件(红色、绿色和蓝色),即使桌面未使用RGB或RGBA颜色格式。对于例如,索引的256色显示器可以报告RedBits=3、GreenBits=3和BlueBits=2加起来总共8个比特。

桌面视频模式是GLFW窗口打开时桌面使用的视频模式打开,而不是当前视频模式(如果GLFW窗口是全屏窗口)。

typedef struct {
int Width, Height; // Video resolution
int RedBits; // Number of red bits
int GreenBits; // Number of green bits
int BlueBits; // Number of blue bits
} GLFWvidmode;

请参阅Jonas Wielicki的答案,了解其他选择。

我做了一个跨平台的c++函数:

#if WIN32
#include <windows.h>
#else
#include <X11/Xlib.h>
#endif
//...
void getScreenResolution(int &width, int &height) {
#if WIN32
width  = (int) GetSystemMetrics(SM_CXSCREEN);
height = (int) GetSystemMetrics(SM_CYSCREEN);
#else
Display* disp = XOpenDisplay(NULL);
Screen*  scrn = DefaultScreenOfDisplay(disp);
width  = scrn->width;
height = scrn->height;
#endif
}
int main() {
int width, height;
getScreenResolution(width, height);
printf("Screen resolution: %dx%dn", width, height);
}