EnumDisplayMonitors

指定されたクリッピング領域とデバイスコンテキストの可視領域が交差して形成される領域と重なる部分のあるディスプレイモニタを列挙します。EnumDisplayMonitors 関数は、該当した各ディスプレイモニタについて 1 度ずつアプリケーション定義のコールバック関数 MonitorEnumProc を呼び出します。

BOOL EnumDisplayMonitors (
  HDC hdc,                   // ディスプレイデバイスコンテキストのハンドル
  LPCRECT lprcClip,          // クリッピング領域を指定
  MONITORENUMPROC lpfnEnum,  // コールバック関数へのポインタ
  LPARAM dwData              // コールバック関数に渡すデータ
);

パラメータ

hdc
目的の可視領域を定義するディスプレイデバイスコンテキストのハンドルを指定します。

このパラメータに NULL を指定すると、MonitorEnumProc 関数に渡される hdcMonitor パラメータが NULL になり、デスクトップ上のすべてのディスプレイを含む仮想画面が目的の可視領域として使われます。

lprcClip
クリッピング領域を定義する RECT 構造体へのポインタを指定します。このクリッピング領域と hdc パラメータで指定した可視領域との交差領域が、各ディスプレイモニタと重なるかどうか判定されます。

hdc パラメータに NULL 以外の値を指定した場合、クリッピング領域の座標は hdc パラメータで指定した可視領域の原点に対する相対座標となります。hdc パラメータに NULL を指定した場合は、仮想画面の座標系が使われます。

hdc パラメータで指定した領域を一切クリッピングない場合、このパラメータに NULL を指定します。

lpfnEnum
アプリケーション定義のコールバック関数 MonitorEnumProc へのポインタを指定します。
dwData
アプリケーション定義のデータを指定します。このデータは、EnumDisplayMonitors 関数から MonitorEnumProc 関数にそのまま渡されます。

戻り値

関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。
Windows NT/2000:拡張エラー情報を取得するには、GetLastError 関数を使います。

解説

EnumDisplayMonitors 関数を呼び出す状況としては、主に次の 2 つがあります。

  • モニタごとにカラー形式が異なるシステムで、複数のモニタにまたがるデバイスコンテキストに対して最適な描画を行う場合。

  • 1 台以上のディスプレイモニタのハンドルとその長方形領域の位置を取得する場合。

現在のシステムにあるすべてのディスプレイモニタが同じカラー形式を採用しているかどうかを調べるには、SM_SAMEDISPLAYFORMAT を指定して GetSystemMetrics 関数を呼び出します。
1 つの“ウィンドウ”が異なるカラー形式を持つ複数のディスプレイモニタにまたがっている場合は、必ずしも EnumDisplayMonitors 関数を使う必要はありません。ウィンドウの場合は、画面全体がプライマリモニタと同じカラープロパティを持つものとして描画処理を行っても正常に表示されます。ただし、EnumDisplayMonitors 関数を使うと見栄えをよりよくすることが可能になります。
hdc パラメータに NULL を指定して EnumDisplayMonitors 関数を呼び出すと、1 台以上のディスプレイモニタのハンドルとその長方形領域の位置を取得することができます。次の表は、パラメータ hdc lprcClip に NULL を指定した場合と NULL 以外の値を指定した場合の 4 とおりのケースについて、EnumDisplayMonitors 関数の動作をまとめたものです。

hdclprcRectEnumDisplayMonitors 関数の処理内容
NULLNULLすべてのディスプレイモニタを列挙します。

コールバック関数に渡される HDC は NULL になります。

NULLNULL 以外の値クリッピング領域と重なる部分のあるディスプレイモニタだけを列挙します。クリッピング領域には、仮想画面の座標系が使われます。

コールバック関数に渡される HDC は NULL になります。

NULL 以外の値NULLデバイスコンテキストの可視領域と重なる部分のあるディスプレイモニタだけを列挙します。

コールバック関数には、特定のディスプレイモニタのデバイスコンテキストハンドルが渡されます。

NULL 以外の値NULL 以外の値デバイスコンテキストの可視領域とクリッピング領域との交差部分と重なる部分のあるディスプレイモニタだけを列挙します。クリッピング領域には、デバイスコンテキストの座標系が使われます。

コールバック関数には、特定のディスプレイモニタのデバイスコンテキストハンドルが渡されます。


WM_PAINT メッセージを受け取ったときに、各モニタの性能を使って描画を行うには、ウィンドウプロシージャ内で次のようなコードを記述します。

case WM_PAINT:
  hdc = BeginPaint(hwnd, &ps);
  EnumDisplayMonitors(hdc, NULL, MyPaintEnumProc, 0);
  EndPaint(hwnd, &ps);

各モニタの性能を使ってウィンドウの上半分に描画を行うには、次のようなコードを記述します。

GetClientRect(hwnd, &rc);
rc.bottom = (rc.bottom + rc.top)/2;
hdc = GetDC(hwnd);
EnumDisplayMonitors(hdc, &rc, MyPaintEnumProc, 0);
ReleaseDC(hwnd, hdc);

各ディスプレイモニタの仮想画面全体に最適な方法で描画を行うには、次のようなコードを記述します。

hdc = GetDC(NULL);
EnumDisplayMonitors(hdc, NULL, MyPaintScreenEnumProc, 0);
ReleaseDC(NULL, hdc);

すべてのディスプレイモニタに関する情報を取得するには、次のようなコードを記述します。

EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);

対応情報

  Windows NT/2000:Windows 2000
  Windows 95/98:Windows 98
  ヘッダー:winuser.h 内で宣言
  インポートライブラリ:user32.lib を使用

参照

MonitorEnumProc

表示: