Есть ли способ получить нативное разрешение в c ++ и winapi? - PullRequest
2 голосов
/ 10 мая 2019

Есть ли способ получить рекомендуемое разрешение в c ++ и winapi?

Я получаю только текущее разрешение, используя GetMonitorInfo, EnumDisplaySettings, EnumDisplayMonitors или GetSystemMetrics.

Edit: После некоторых исследований я нашел этот пример кода Пример кода для отображения приложения на портретном устройстве .

Даже если речь идет не о собственном разрешении, оно показывает, как его получить. Для этого взгляните на функции HRESULT GetPathInfo(_In_ PCWSTR pszDeviceName, _Out_ DISPLAYCONFIG_PATH_INFO* pPathInfo) и bool IsNativeOrientationPortrait(const LUID AdapterLuid, const UINT32 TargetId).

Код работает до сих пор, но я не знаю, как он ведет себя под Windows 8.1 и предыдущими версиями. Никаких дальнейших испытаний не проводилось.

1 Ответ

0 голосов
/ 13 мая 2019

На самом деле вы можете выполнить GetSupportedFullScreenResolutions, чтобы получить список разрешений, которые поддерживает монитор, и обычно последний индекс является лучшим (самым высоким) разрешением для монитора.

Как это:

#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
    DEVMODE dm = { 0 };
    dm.dmSize = sizeof(dm);
    for (int iModeNum = 0; EnumDisplaySettings(NULL, iModeNum, &dm) != 0; iModeNum++) 
    {
        cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl;
    }

    return 0;
}

EDIT:

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

#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
    UINT32 PathArraySize = 0;
    UINT32 ModeArraySize = 0;
    DISPLAYCONFIG_PATH_INFO* PathArray;
    DISPLAYCONFIG_MODE_INFO* ModeArray;
    DISPLAYCONFIG_TOPOLOGY_ID CurrentTopology;
    //Directly query the resolution of the graphics card and get the physical resolution all the time.
    GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &PathArraySize, &ModeArraySize);
    PathArray = (DISPLAYCONFIG_PATH_INFO*)malloc(PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
    memset(PathArray, 0, PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
    ModeArray = (DISPLAYCONFIG_MODE_INFO*)malloc(ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
    memset(ModeArray, 0, ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
    LONG ret = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray, &ModeArraySize, ModeArray, &CurrentTopology);

    int x_DisplayConfigScreen = ModeArray->targetMode.targetVideoSignalInfo.activeSize.cx;
    int y_DisplayConfigScreen = ModeArray->targetMode.targetVideoSignalInfo.activeSize.cy;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...