トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

プログラミングメモ(セカンダリモニタへの表示)

セカンダリディスプレイとか言うことも多いかもしれないけど
ここではモニタって言うことにするよ

過去にJavaで作ったプログラムをC++に移植しようとして
ずっと詰まってたのがこれ
複数モニタの環境でセカンダリモニタにウィンドウを表示させる
考え方はJavaと変わらないんだけど実装方法がわからなかった
基本的にWindows環境でのC++の記事だけど一番最後にJavaでのコードもあるよ

説明は追記で
これはJavaでもC++でも変わらないんだけど
セカンダリモニタに表示するって言っても
「セカンダリモニタに表示」見たいな命令があるわけじゃなくて
二つのモニタを合わせたでかいスクリーン座標系で
プライマリモニタに映る範囲とセカンダリモニタに映る範囲があって
セカンダリモニタに映る範囲にウィンドウを置いてやれば
セカンダリモニタに表示するということが実現できるという話


ここで必要になるのがセカンダリモニタの左上の座標
欲しい座標
こいつがわかればそれを元にウィンドウの座標を設定してやれば
セカンダリモニタに映してやることができる



さてここからプログラムの話

各モニタの情報はGetMonitorInfo関数に
MONITORINFOEX構造体のポインタを渡せばもらえるらしい
MONITORINFOEX構造体にはそのモニタがある座標や
そのモニタがプライマリかどうかという情報が入っているからそれを使う

GetMonitorInfo関数はもう一つの引数に
その情報が欲しいディスプレイモニタのハンドルが必要になる
で、そのディスプレイモニタのハンドルは
EnumDisplayMonitors関数からコールバック関数に渡される
EnumDisplayMonitors関数は各ディスプレイモニタに対してコールバック関数を呼ぶもので
コールバック関数にディスプレイモニタのハンドルなどを渡して処理ができるようになっている



ここから流れを整理すると

EnumDisplayMonitors関数を呼ぶ

各モニタに対してコールバック関数が呼ばれる

引数で受け取ったディスプレイモニタのハンドルを使って
コールバック関数内でGetMonitorInfo関数を呼んでやる

MONITORINFOEX構造体の情報を元にプライマリかどうかの判定と
セカンダリならモニタの座標をとっておく

これでセカンダリモニタの左上の座標が手に入る

関数のちゃんとした仕様はMSDNに行って調べればいいと思うよ

とりあえず上の流れを実装したサンプルコード

RECT bounds={0,0,0,0};//セカンダリモニタの座標を入れる変数

//EnumDisplayMonitors関数に渡すコールバック関数
BOOL CALLBACK MyInfoEnumProc(
HMONITOR hMonitor,//モニタのハンドル
HDC hdcMonitor,
LPRECT lprcMonitor,
LPARAM dwData
){
MONITORINFOEX mInfo;
mInfo.cbSize=sizeof(MONITORINFOEX);//構造体のサイズを設定(必須)
GetMonitorInfo(hMonitor,&mInfo);//モニタの情報をとってくる
if(mInfo.dwFlags==0){
//プライマリモニタでなければモニタの座標を入れる
bounds=mInfo.rcMonitor;
}
return TRUE;
}

//メイン
INT WINAPI WinMain(
HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR szStr,
INT iCmdShow
){
/*
*略
*/

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc,NULL);

//(bounds.left,bounds.top)がセカンダリモニタの左上の座標

/*
*略
*/
}

まぁわかったら簡単だったけど調べるの割と苦労したなぁ……



ちなみにJavaで似たようなことしようとするとどうなるかというと……
GraphicsDevice[] gd=GraphicsEnvironment.
getLocalGraphicsEnvironment().getScreenDevices();
Rectangle bounds=gd[1].getDefaultConfiguration().getBounds();
これだけ
まぁjava.awtからいくつかクラスをインポートする必要はあるけど
  1. 2010/09/25(土) 21:03:47|
  2. 試験的な物
  3. | トラックバック:0
  4. | コメント:0
<<滑り込み | ホーム | UV展開40%完了>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/708-00d08989
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。