簡體   English   中英

確定Qt / C ++中可用的顯示分辨率

[英]Determine available display resolutions in Qt/C++

在Windows和其他桌面操作系統中,顯示設置中始終是一個組合框,顯示所有可用的顯示分辨率。

我在Qt或C ++中需要這種組合框,但我被卡住了。

我在這里找到一種C#方法: 如何使用C#列出可用的視頻模式?

我找到了一種C ++方法: 如何在多監視器系統上檢測最大化事件

MSDN在EnumDisplaySettingsEx函數文檔中表示,可以通過對參數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是否有一種方法可以接收所有可用的顯示分辨率?

親切的問候,
皮克斯塔

Qt沒有提供任何具有此類信息的API。 您可以通過QScreen:geometry()給定屏幕的當前分辨率。 但是,沒有Qt方法可以獲取可用分辨率的列表,也無法切換它們。

您需要查找有關平台的特定問題,並詢問是否不存在。 一個問題應該涵蓋一個平台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM