デバイス情報を得る


画面の幅を知る

マルチタスクのグラフィックシステムにおいて、デバイスの情報は重要です
とくに、画面解像度やデバイスの色の表示能力など
異なる様々な環境で、グラフィックの描画をプログラマが意図したとおりに動かすには
その環境の情報が必ず必要になります

ウィンドウを表示するとき、最初に画面の中央に表示させたい場合など
画面のサイズなどは、とくに重要になります
このようなデバイスの情報を得るには GetDeviceCaps() 関数を使います

int GetDeviceCaps(HDC hdc , int nIndex);

hdc には、デバイスコンテキストのハンドルを
nIndex には、取得したい情報を表す定数を指定します

nIndex で指定したデバイスの情報が戻り値として返ります
取得できる情報はサイズやデバイスの能力など様々です

ここでは、画面解像度を得るためのプログラムを作ってみましょう
画面解像度の横幅は HORZRES、高さは VERTRES
第二引数の nIndex に指定することで得ることができます
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	TEXTMETRIC tm;
	TCHAR str[64];

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);

		GetTextMetrics(hdc , &tm);
		wsprintf(str , "横幅 %d px" , GetDeviceCaps(hdc , HORZRES));
		TextOut(hdc , 10 , 10 , str , lstrlen(str));
		wsprintf(str , "高さ %d px" , GetDeviceCaps(hdc , VERTRES));
		TextOut(hdc , 10 , 10 + tm.tmHeight , str , lstrlen(str));

		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}
このプログラムを実行すると、デバイスの解像度を表示します
この場合は、ディスプレイの解像度ですね

このほかにも、テキスト表示機能、曲線や直線の表示機能等も知ることができます
これらは、ディスプレイではとくに重要ではありませんが
プリンタやプロッタなど、他のデバイスの情報を知りたい時に重要になります
//プリンタなどへの印刷プログラムは、後ほど紹介します


GetDeviceCaps()

int GetDeviceCaps(HDC hdc , int nIndex);

指定されたデバイスに関するデバイス固有の情報を取得します

hdc - デバイスコンテキストのハンドルを指定します
nIndex - 取得する項目を定数で指定します

戻り値 - 要求した項目の情報

定数解説
DRIVERVERSION デバイスドライバのバージョン
TECHNOLOGY デバイステクノロジー
次の値のいずれかになります。
意味
DT_PLOTTER ベクタプロッタ
DT_RASDISPLAY ラスタディスプレイ
DT_RASPRINTER ラスタプリンタ
DT_RASCAMERA ラスタカメラ
DT_CHARSTREAM 文字ストリーム
DT_METAFILE メタファイル
DT_DISPFILE ディスプレイファイル
hdc パラメータで拡張メタファイルのデバイスコンテキストを指定したときは
CreateEnhMetaFile()関数に対して指定した参照デバイスのデバイステクノロジーが返ります
拡張メタファイルのデバイスコンテキストかどうかを調べるには
GetObjectType() 関数を使います
HORZSIZE 物理画面の幅 (ミリメートル単位)
VERTSIZE 物理画面の高さ (ミリメートル単位)
HORZRES 画面の幅 (ピクセル単位)
VERTRES 画面の高さ (ピクセル単位)
LOGPIXELSX 画面の水平方向のピクセル数 (論理インチ当たり)
LOGPIXELSY 画面の垂直方向のピクセル数 (論理インチ当たり)
BITSPIXEL ピクセルあたりのカラービットの数 (プレーンごと)
PLANES カラープレーンの数
NUMBRUSHES デバイス固有のブラシの数
NUMPENS デバイス固有のペンの数
NUMFONTS デバイス固有のフォントの数
NUMCOLORS デバイスのカラーテーブルのエントリ数
ピクセルあたり 8 ビットを超える場合は -1
ASPECTX 線の描画に使うデバイスピクセルの相対幅
ASPECTY 線の描画に使うデバイスピクセルの相対高さ
ASPECTXY 線の描画に使うデバイスピクセルの対角線の幅
PDEVICESIZE 予約済み
CLIPCAPS デバイスのクリッピング能力を示すフラグ
長方形のクリップをサポートする場合は 1
それ以外の場合は 0
SIZEPALETTE システムパレット内のエントリ数
RASTERCAPS インデックスに
RC_PALETTE ビットがセットされていること
NUMRESERVED システムパレット内の予約エントリ数
RASTERCAPS インデックスに
RC_PALETTE ビットがセットされていること
COLORRES デバイスの実際のカラー解像度を表す
ピクセル当たりのビット数
RASTERCAPS インデックスに
RC_PALETTE ビットがセットされていること
PHYSICALWIDTH 印刷デバイス用
物理的なページ全体の幅 (デバイス単位)
PHYSICALHEIGHT 印刷デバイス用
物理的なページ全体の高さ (デバイス単位)
PHYSICALOFFSETX 印刷デバイス用
物理的なページの左辺から
印刷可能領域の左辺までの距離 (デバイス単位)
PHYSICALOFFSETY 印刷デバイス用
物理的なページの上辺から
印刷可能領域の上辺までの距離 (デバイス単位)
VREFRESH Windows NT のみ
現在のディスプレイ出力の垂直周波数 (Hz)
0 または 1 はディスプレイのデフォルト周波数を示す
DESKTOPHORZRES Windows NT のみ
仮想デスクトップの幅 ( ピクセル単位 )
DESKTOPVERTRES Windows NT のみ
仮想デスクトップの高さ (ピクセル単位)
BLTALIGNMENT Windows NT のみ
デバイスに適した水平方向のアラインメント
適したアラインメントが特にないときは 0
RASTERCAPS デバイスのラスタ能力を示します
次の値の組み合わせになります
意味
RC_BANDING バンド処理のサポートが必要
RC_BITBLT ビットマップの転送をサポート
RC_BITMAP64 64K バイトより大きいビットマップをサポート
RC_DI_BITMAP SetDIBits 関数と GetDIBits 関数をサポート
RC_DIBTODEV SetDIBitsToDevice 関数をサポート
RC_FLOODFILL 塗りつぶしをサポート
RC_GDI20_OUTPUT Windows2.0 の機能をサポート
RC_PALETTE パレットベースのデバイス
RC_SCALING スケーリングをサポート
RC_STRETCHBLT StretchBlt 関数をサポート
RC_STRETCHDIB StretchDIBits 関数をサポート
CURVECAPS デバイスの曲線描画能力を示します
次の値の組み合わせになります
意味
CC_NONE 曲線をサポートしない
CC_CIRCLES 円をサポート
CC_PIE 扇形をサポート
CC_CHORD 弓形をサポート
CC_ELLIPSES 楕円をサポート
CC_WIDE 太い線をサポート
CC_STYLED スタイル付きの線をサポート
CC_WIDESTYLED スタイル付きの太い線をサポート
CC_INTERIORS 内部の塗りつぶしをサポート
CC_ROUNDRECT 角の丸い長方形をサポート
LINECAPS デバイスの直線描画能力を示します
次の値の組み合わせになります
意味
LC_NONE 直線をサポートしない
LC_POLYLINE 折れ線をサポート
LC_MARKER マーカーをサポート
LC_POLYMARKER ポリマーカーをサポート
LC_WIDE 太い直線をサポート
LC_STYLED スタイル付きの直線をサポート
LC_WIDESTYLED スタイルを持つ太い直線をサポート
LC_INTERIORS 内部の塗りつぶしをサポート
POLYGONALCAPS デバイスの多角形描画能力を示します
次の値の組み合わせになります
意味
PC_NONE 多角形をサポートしない
PC_POLYGON 交互モードの塗りつぶしをサポート
PC_RECTANGLE 長方形をサポート
PC_WINDPOLYGON 全域モードでの塗りつぶしをサポート
PC_SCANLINE 単一の走査行の描画をサポート
PC_WIDE 太い線をサポート
PC_STYLED スタイル付きの線をサポート
PC_WIDESTYLED スタイル付きの太い線をサポート
PC_INTERIORS 内部の塗りつぶしをサポート
TEXTCAPS デバイスがテキスト表示能力を示します
次の値の組み合わせになります
意味
TC_OP_CHARACTER キャラクタの出力精度をサポート
TC_OP_STROKE ストロークの出力精度をサポート
TC_CP_STROKE ストローククリップの精度をサポート
TC_CR_90 キャラクタの 90 度回転をサポート
TC_CR_ANY キャラクタの任意の角度の回転をサポート
TC_SF_X_YINDEP x 方向と y 方向の両方の
独立したスケーリングをサポート
TC_SA_DOUBLE キャラクタの 2 倍のスケーリングをサポート
TC_SA_INTEGER キャラクタの整数倍のスケーリングをサポート
TC_SA_CONTIN キャラクタの任意の倍率の
スケーリングをサポート
TC_EA_DOUBLE 太字をサポート
TC_IA_ABLE イタリック体をサポート
TC_UA_ABLE 下線をサポート
TC_SO_ABLE 取り消し線をサポート
TC_RA_ABLE ラスタフォントをサポート
TC_VA_ABLE ベクトルフォントをサポート
TC_RESERVED 予約済み (0)
TC_SCROLLBLT ビットブロック転送による
スクロールをサポートしない



前のページへ戻る次のページへ