в Windows и других настольных операционных системах - это всегда поле со списком в настройках отображения, показывающее все доступные разрешения дисплея.Определение доступных разрешений дисплея в Qt/C++
Мне нужен такой ящик со списком в Qt или C++, и я застрял.
Я нашел C# подход здесь: How to list available video modes using C#?
Я нашел ++ подход C: How to Detect Maximize event on multi-monitor system
MSDN говорит в EnumDisplaySettingsEx function доку, что все разрешения экрана могут быть получены путем итерации по аргументу iModeNum:
Индексы графического режима начинаются с нуля. Чтобы получить информацию обо всех графических режимах устройства отображения, сделайте серию вызовов EnumDisplaySettingsEx следующим образом: Установите iModeNum в ноль для первого вызова и увеличьте iModeNum на один для каждого последующего вызова. Продолжайте вызывать функцию до тех пор, пока возвращаемое значение не станет равным нулю.
Я изменил подход C++, чтобы получить свою цель в Windows:
#include <QCoreApplication>
#include <windows.h>
#include <stdio.h>
#define DEFAULT_DISPLAY_WIDTH 0
#define DEFAULT_DISPLAY_HEIGHT 0
#define DEFAULT_DISPLAY_FREQUENCY 60
#define DEFAULT_DISPLAY_SOURCE 0
struct DisplayResolution
{
DisplayResolution(int _width = DEFAULT_DISPLAY_WIDTH,
int _height = DEFAULT_DISPLAY_HEIGHT,
int _frequency = DEFAULT_DISPLAY_FREQUENCY,
int _defaultSource = DEFAULT_DISPLAY_SOURCE)
{
width = _width;
height = _height;
frequency = _frequency;
defaultSource = _defaultSource;
}
int width;
int height;
int frequency;
int defaultSource;
};
typedef std::vector<DisplayResolution>::iterator DisplayResolutionIterator;
std::vector<DisplayResolution> getAvailableDisplayResolutions()
{
DISPLAY_DEVICE disp;
DISPLAY_DEVICE adapter;
DEVMODE mode;
std::vector<DisplayResolution> displayResolutions;
int i = 0, j = 0, display_count = 0, k = 0;
// Initialize win32 structs.
memset(&disp, 0, sizeof(DISPLAY_DEVICE));
disp.cb = sizeof(DISPLAY_DEVICE);
memset(&adapter, 0, sizeof(DISPLAY_DEVICE));
adapter.cb = sizeof(DISPLAY_DEVICE);
memset(&mode, 0, sizeof(DEVMODE));
mode.dmSize = sizeof(DEVMODE);
//memset(the_displays, 0, sizeof(the_displays));
// adapter loop:
while(EnumDisplayDevices(NULL, i, &adapter, 0))
{ // multiple displays on single adapter loop:
j = 0;
qDebug() << (TCHAR*)&adapter.DeviceName;
while(EnumDisplayDevices((TCHAR*)&adapter.DeviceName, j, &disp, 0))
{
// The device must be active, attached to desktop and not a mirroring device.
if((disp.StateFlags & DISPLAY_DEVICE_ACTIVE)
&& (disp.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
&& !(disp.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
{
// read display settings.
k = 0;
while(EnumDisplaySettingsEx((TCHAR*)&adapter.DeviceName, k, &mode, 0))
{
displayResolutions.push_back(DisplayResolution(mode.dmPelsWidth,
mode.dmPelsHeight,
mode.dmDisplayFrequency,
mode.dmDefaultSource));
// Reset
memset(&mode, 0, sizeof(DEVMODE));
mode.dmSize = sizeof(DEVMODE);
++display_count;
++k;
}
}
// Reset
memset(&disp, 0, sizeof(DISPLAY_DEVICE));
disp.cb = sizeof(DISPLAY_DEVICE);
++j;
}
// Reset
memset(&adapter, 0, sizeof(DISPLAY_DEVICE));
adapter.cb = sizeof(DISPLAY_DEVICE);
++i;
}
return displayResolutions;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::vector<DisplayResolution> displayResolutions = getAvailableDisplayResolutions();
DisplayResolutionIterator it = displayResolutions.begin();
DisplayResolutionIterator itEnd = displayResolutions.end();
for(it; it != itEnd; ++it)
{
printf("Resolution: ");
printf("%i x %i", (*it).width, (*it).height);
printf(" (%iHz)", (*it).frequency);
printf(" @Source:%i", (*it).defaultSource);
printf("\n");
}
return a.exec();
}
Надеемся, что она помогает людям в Windows, чтение, но Unix?
Я знаю один метод в Qt, но это будет собирать только текущее разрешение дисплея с помощью QDesktopWidget::availableGeometry.
Есть ли способ Qt для получения всех доступных разрешений дисплея?
С наилучшими пожеланиями,
Pixtar
Если вы используете X11, для этого существуют X-специфические механизмы. Для всего остального вам понадобится подход, ориентированный на бэкэнд. –
Итак, вы имеете в виду что-то вроде [XOpenDisplay] (https://linux.die.net/man/3/xopendisplay) и [DefaultScreenOfDisplay] (https://linux.die.net/man/3/defaultscreenofdisplay). Насколько я понял - это даст мне доступ только к текущему разрешению экрана, но не ко всем доступным разрешениям. – Pixtar
Это дает вам только текущее разрешение. В любом случае, это отдельный вопрос - возможно, поиск, и вы найдете его уже спрошенным и ответили. –