4

私は、WindowsOSの特定のディスプレイに新しいウィンドウを生成するようにc++製品の1つを変更するという任務を負っています。これは、タイル化されたマルチディスプレイの視覚化を構成できる必要があるクライアント向けです。各ディスプレイは、1台のコンピューター上の個別のグラフィックカードによって駆動されます。

Linuxでは、各ディスプレイでXサーバーを起動し、DISPLAY env varを適切に設定して視覚化ソフトウェアの複数のインスタンスを起動することで、これを簡単に行うことができます。しかし、Windowsでこれを行うことになると私は迷子になります。ポインタ/提案/例はありますか?

4

2 に答える 2

3

すべてのモニターを列挙し、仮想画面(MSDN)でそれらのマッピングを確認する必要があります。

モニターは、EnumDisplayMonitors(MSDN)の呼び出しを介して列挙されます。これにより、 GetMonitorInfo(MSDN)に渡して、仮想画面上のモニターの場所を取得HMONITORできる一連のハンドルが列挙されます。

マルチモニターサポートのガイド全体もあり、読む価値があるかもしれません。

複数のディスプレイモニターについて(Windows)@ MSDN

いくつかの警告:仮想画面はユーザー制御のマッピングであるため、ユーザーが仮想座標空間にモニターが配置されている場所の反対側の物理的な側にモニターをセットアップすることを妨げるものは何もありません。他の奇妙な配置シナリオ。また、一部のディスプレイカードは、プラグインの検出時にモニターがどこにあるかを想定しようとします。これは、ソフトウェアの観点からは間違っている可能性がありますが、ユーザーが左側にマップされているディスプレイポートに注意を払っていないことが原因である可能性があります(ラベルが付けられている場合でも)。

于 2013-01-22T19:55:04.573 に答える
3

EnumDisplayMonitorsWin32 APIの関数を使用して、各ディスプレイに関する情報を取得できます。

必要な表示用の長方形ができたら、何をすべきかがわかります=)

ディスプレイは順番に列挙されていると確信しています。ただし、タイリングしている場合は、すべての表示長方形のベクトルを取得して、それらを並べ替えることができます。

すべてのモニター情報を取得するために、しばらく前に書いた便利なラッパーがあります。

宣言

class CMonitorInfoEx : public MONITORINFOEX
{
public:
    CMonitorInfoEx();

    LPCRECT GetRect() const { return &rcMonitor; }
    LPCRECT GetWorkRect() const { return &rcWork; }
    LPCTSTR DeviceName() const { return szDevice; }

    bool IsPrimary() const { return (dwFlags & MONITORINFOF_PRIMARY) ? true : false; }

    int Width() const { return rcMonitor.right - rcMonitor.left; }
    int Height() const { return rcMonitor.bottom - rcMonitor.top; }
    int WorkWidth() const { return rcWork.right - rcWork.left; }
    int WorkHeight() const { return rcWork.bottom - rcWork.top; }
};


class CSysDisplays
{
public:
    CSysDisplays();

    void Update();

    int Count() const;
    const CMonitorInfoEx& Get( int i ) const;

private:
    std::vector<CMonitorInfoEx> mInfo;
};

実装

BOOL CALLBACK MonitorEnumProc( __in  HMONITOR hMonitor, __in  HDC hdcMonitor, __in  LPRECT lprcMonitor, __in  LPARAM dwData )
{
    std::vector<CMonitorInfoEx>& infoArray = *reinterpret_cast< std::vector<CMonitorInfoEx>* >( dwData );
    CMonitorInfoEx info;
    GetMonitorInfo( hMonitor, &info );
    infoArray.push_back( info );
    return TRUE;
}

CMonitorInfoEx::CMonitorInfoEx()
{
    cbSize = sizeof(MONITORINFOEX);
}


CSysDisplays::CSysDisplays()
{
    Update();
}


void CSysDisplays::Update()
{
    mInfo.clear();
    mInfo.reserve( ::GetSystemMetrics(SM_CMONITORS) );
    EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(&mInfo) );
}


int CSysDisplays::Count() const
{
    return (int)mInfo.size();
}


const CMonitorInfoEx& CSysDisplays::Get( int i ) const
{
    return mInfo[i];
}
于 2013-01-22T19:55:18.853 に答える