Портативный способ на С++ для разрешения рабочего стола

Я делаю С++-игру, и я хочу, чтобы она автоматически получала разрешение рабочего стола пользователя.

Я нашел решения только для окон до сих пор - есть способ/библиотека, чтобы найти разрешение на Windows/Mac/Linux?

Ответ 1

Существует несколько библиотек, которые помогут вам получить работу на низкоуровневом уровне. В любом случае вам, вероятно, понадобится больше вещей на этих платформах, поэтому я перечислил некоторые из них:

Ответ 2

GLFW предоставляет кроссплатформенную (для Windows, Mac и Linux) способ получить режим настольного видео. Это C api, но будет работать на С++. Соответствующая функция (и документация) находится здесь:

void glfwGetDesktopMode( GLFWvidmode *mode )

Параметры

mode Указатель на структуру GLFWvidmode, которая будет заполнена функцией.

Возвращаемые значения

Структура GLFWvidmode, на которую указывает режим, заполняется режимом настольного видео.

Описание

Эта функция возвращает режим видео в рабочем столе в структуре GLFWvidmode. См. glfwGetVideoModes для определения структуры GLFWvidmode.

Примечания

Глубина цвета на рабочем столе всегда сообщается как количество бит для каждого отдельного цвета (красный, зеленый и синий), даже если на рабочем столе не используется цветной формат RGB или RGBA. Для Например, индексированный 256-цветный дисплей может сообщать RedBits = 3, GreenBits = 3 и BlueBits = 2, что добавляет до 8 бит.

Режим видео на рабочем столе - это видеорежим, используемый на рабочем столе в то время, когда окно GLFW было , а не текущий видеорежим (который может отличаться от режима настольного видео, если GLFW window - полноэкранное окно).

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 для альтернатив.

Ответ 3

Я сделал кроссплатформенную функцию 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%d\n", width, height);
}

Ответ 4

Я думаю, что это не работает с несколькими мониторами. Кто-нибудь имел опыт работы с разрешениями на мультиблочных мониторах?