プログラム講座 上級編10
- 接続されているモニタ数とサイズを返す -
 上級編10です。今回は「グラフィックデバイスマネージャー」を使ったサンプルプログラムです。
◆グラフィックデバイスとは?
 Macintoshは、複数のモニタを表示させる事ができます。マルチモニタ、マルチディスプレイとも言われます。この複数のディスプレイを管理しているのが「グラフィックデバイスマネージャー」です。ここでいう「デバイス」とは「ディスプレイ」と置き換えて読んでいただいて良いかと思います。
 ディスプレイが1つしかない場合は今までと変わらない処理を行えば良いのですが、2つになった場合は処理を考える場合が発生します。例えばウィンドウのサイズを変更するような場合です。メインのディスプレイサイズに合わせるのか、それとも複数のディスプレイも含めた最大サイズにするのか?などです。カラーピッカーなどもメインディスプレイに表示するのか2台目のディスプレイに表示するのか、考えつくものはいくつかあります。
 今回はディスプレイの接続数および、それらの画面サイズを求めるプログラムを作成してみましょう。
◆デバイス数を求めるには?
 デバイス数を求めるには2つのToolbox関数を使います。1つはFN GETDEVICELIST、もう1つはFN GETNEXTDEVICEです。どちらもグラフィックデバイスへのハンドルを返すのですが、使う場所が異なります。最初にグラフィックデバイスハンドルを求める場合は、必ずFN GETDEVICELISTを使い、2台目以降のデバイスではFN GETNEXTDEVICEを使うのです。
 このFN GETNEXTDEVICEの戻り値が0だったら「接続されていない」、0以外であれば「デバイスがある」という事になります。よってデバイス数を数えるには最初にFN GETDEVICELISTでデバイスハンドルを取得後、FN GETNEXTDEVICEの値が0かどうかを調べればよい事になります。2台ではなく3台以上という事も考えられますので、WHILE~WENDループを利用すると楽です。
◆デバイスの矩形サイズを求めるには?
 グラフィックデバイスハンドルを取得できれば、矩形サイズは簡単に求める事ができます。あらかじめ定数として_GDRECTが定義されていますので[gdH&] + _GDRECTで矩形サイズを求める事ができます。注意点としては「表示領域」が返ってくるのであって「横幅、縦幅」が返ってくるのではない、という点です。つまり2台目では1台目と2台目の横幅を合わせた値が返ってくるのです。これに注意すれば、幅を求めることが出来ます。
◆終わりに
 グラフィックデバイスマネージャーは、そんなに難しくありません。難しいのは、複数のディスプレイが接続されている時に、どういう処理を行うか?といった点です。また、ペイントソフト等であればディスプレイの色数なども重要になります。
 FB本が終わったので久々の更新(^^;
 次回は謎です。3D関係とかもやりたいんですけどね〜
◆今回のプログラムリスト
'---------------------------------------------------------------
' "接続されているデバイスの数とサイズを返します"
'---------------------------------------------------------------
TEXT _applFont,12
DIM rect;8
gdH& = FN GETDEVICELIST
count% = 0
WHILE gdH& <> 0
  err% = FN HLOCK(gdH&)
  rect;8 = [gdH&] + _GDRECT:                      ' "デバイスの矩形サイズを読み込む"
  err% = FN HUNLOCK(gdH&)
  INC(count%)
  RIGHT% = rect.right% - rect.left%
  BOTTOM%= rect.bottom% - rect.top%
  PRINT count%;" = (0,0)-(";RIGHT%;",";BOTTOM%;")"
  gdH& = FN GETNEXTDEVICE(gdH&)
WEND
PRINT "接続されているモニタは";count%;"個です"
STOP
END
'"----------------- Graphic Device Handleの中身 ----------------
'"gdRefNum:      2 Bytes  {ドライバ参照番号}
'"gdID:          2 Bytes  {予約。常に0}
'"gdType:        2 Bytes  {デバイスタイプ:フルカラーか、それ以外か}
'"gdITable:      4 Bytes  {COLOR Manager用カラーテーブル}
'"gdResPref:     2 Bytes  {解像度}
'"gdSearchProc:  4 Bytes  {search関数へのハンドル}
'"gdCompProc:    4 Bytes  {complement関数へのハンドル}
'"gdFlags:       2 Bytes  {グラフィックデバイスフラグ}
'"gdPMap:        4 Bytes  {PixMapレコードへのハンドル}
'"gdRefCon:      4 Bytes  {参照番号}
'"gdNextGD:      4 Bytes  {次のデバイスへのハンドル}
'"gdRect:        8 Bytes  {デバイスの表示サイズ}
'"gdMode:        4 Bytes  {現在のデバイスモード}
'"gdCCBytes:     2 Bytes  {カーソルデータの幅}
'"gdCCDepth:     2 Bytes  {カーソルデータの色数}
'"gdCCXData:     4 Bytes  {カーソルデータへのハンドル}
'"gdCCXMask:     4 Bytes  {カーソルマスクへのハンドル}
'"gdReserved:    4 Bytes  {予約。常に0}