複数のディスプレイ モニター上でのオブジェクトの配置
複数のモニター上にあるウィンドウまたはメニューは、ビューアーの視覚的な中断を引き起こします。 この問題を最小限に抑えるために、1 台のモニターにメニューと新しいウィンドウと最大化されたウィンドウが表示されます。 次の表は、モニターの選択方法を示しています。
Object | 場所 |
---|---|
window |
CreateWindow(Ex) は、ウィンドウの最も大きな部分を含むウィンドウをモニターに表示します。最小化する前に、ウィンドウの最大部分を含むモニター上で最大化します。 Alt キーと TAB キーの組み合わせにより、現在アクティブなウィンドウがあるウィンドウがモニターに表示されます。 |
所有ウィンドウ | 所有者と同じモニターに表示されます。 |
サブメニュー | 対応するメニュー項目の最大部分を含むモニターに表示されます。 |
コンテキスト メニュー | 右クリックが発生したモニターに表示されます。 |
ドロップダウン リスト (drop-down list) | コンボ ボックスの四角形を含むモニターに表示されます。 |
ダイアログ ボックス | それを所有するウィンドウのモニターに表示されます。DS_CENTERMOUSEスタイルで定義されている場合は、マウスでモニターに表示されます。 所有者とアクティブ ウィンドウがなく、ダイアログ ボックスが同じアプリケーション内にある場合は、現在アクティブなウィンドウのモニターにダイアログ ボックスが表示されます。 ダイアログ ボックスに所有者がなく、アクティブなウィンドウがダイアログ ボックスと同じアプリケーションにない場合は、プライマリ モニターにダイアログ ボックスが表示されます。 |
メッセージ ボックス | それを所有するウィンドウのモニターに表示されます。 |
1 つのウィンドウが 2 つのモニターをまたがり、モニターの 1 つが再配置されると、元のウィンドウの最大部分を含むモニター上にウィンドウが配置されます。
アプリケーションでは、通常、オブジェクトを配置する必要もあります。 たとえば、別のウィンドウと同じモニターにウィンドウを作成する必要がある場合があります。
オブジェクトを複数のモニター・システムに配置するには
- 適切なモニターを決定します。
- モニターへの座標を取得します。
- 座標を使用してオブジェクトを配置します。
通常、オブジェクトは、プライマリ モニター上またはオブジェクトが既に存在するモニター上に配置されます。 特定のポイント、四角形、またはウィンドウのモニターを識別するには、 MonitorFromPoint、 MonitorFromRect、 MonitorFromWindow を使用します。
モニターの座標を取得するには、作業領域とモニターの四角形全体の両方を提供する GetMonitorInfo を使用します。 SM_CXSCREENとSM_CYSCREENは常にプライマリ モニターを参照し、アプリケーションを表示するモニターとは限らないことに注意してください。 また、SM_xxVIRTUALSCREENは避けてください。これは、モニターではなく、仮想画面にウィンドウを中央に移動するためです。
ウィンドウの作業領域でダイアログ ボックスを中央揃えするには、DS_CENTER スタイルを使用します。 ダイアログ ボックスをアプリケーション ウィンドウの中央に配置するには、 GetWindowRect を使用します。 Windows では、メニューとダイアログ ボックスがモニターに自動的に制限されます。 ただし、カスタム メニュー、カスタム ドロップダウン ボックス、カスタム ツール パレット、保存されたアプリケーションの位置に問題が発生する可能性があります。
オブジェクトを正しく配置する方法の例については、「 複数表示設定でのオブジェクトの配置」を参照してください。
SM_CXSCREENとSM_CYSCREENを使用して、アプリケーション デスクトップ ツール バー ( appbar とも呼ばれます) の場所を決定すると、アプリバーがプライマリ モニターに制限されます。 アプリバーを任意のモニターの任意の端に置くことを許可するには、適切なシステム メトリックを使用してモニターの端を計算します。 また、 GET_X_LPARAM マクロと GET_Y_LPARAM マクロを使用して座標を抽出します。そうしないと、座標の符号が間違っている可能性があります。 これらのマクロは Windowsx.h に含まれています。
全画面表示ウィンドウのサイズは、異なる解像度のモニター間を移動する際に変更する必要があります。 これを行うには、アプリケーションで MonitorFromWindow または MonitorFromPoint を使用して、そのウィンドウが表示されているウィンドウをチェックし、GetMonitorInfo を使用してモニターのサイズを取得する必要があります。 代わりに、DirectX DirectDrawEnumerateEx 関数の HMONITOR を使用することもできます。 次 に、SetWindowPos を使用して、モニターをカバーするウィンドウの位置とサイズを設定します。
最大化されたウィンドウでは、"Always on top" プロパティを持つタスク バーはカバーされません。 ただし、全画面表示ウィンドウにはタスク バーが含まれます。たとえば、Microsoft PowerPoint のスライド ショーやゲームなどです。
アプリケーションが終了したときのウィンドウの位置を保存し、後で復元するには、 GetWindowPlacement 関数と SetWindowPlacement 関数を 使用します。 ただし、モニターがシステムから移動または削除された可能性があるため、使用する前に位置がまだ有効であることをチェックします。 アプリケーションは、ウィンドウの HMONITOR が無効な場合に、プライマリ モニターにウィンドウを表示します。
システムは、そのショートカットを含むモニター上でアプリケーションの起動を試みます。 そのため、アプリケーションを配置する 1 つの方法は、目的のモニターにそのショートカットを配置することです。
ShellExecute または ShellExecuteEx を使用する場合は、hWnd を指定して、呼び出し元のアプリケーションと同じモニターで新しいウィンドウを開きます。
MINMAXINFO 構造体の値は、複数のモニターがあるシステムでは若干変更されることに注意してください。