>> WINAPI入門トップに戻る

デバイス情報の取得

今回はデバイス情報の取得について説明します。

主にPCの画面情報を取得する関数として、
GetDeviceCaps関数があります。

int GetDeviceCaps(
HDC hdc, // デバイスコンテキストのハンドル
int nIndex // 能力のインデックス
);

第一引数には出バイスコンテキストのハンドル、
第二引数には以下の指定された定数を使います。
※以下MSDNより引用

DRIVERVERSION	デバイスドライバのバージョン。

TECHNOLOGY	デバイステクノロジ(タイプ)。次の値のいずれかが返ります。
 	DT_PLOTTER	ベクタプロッタ
 	DT_RASDISPLAY	ラスタディスプレイ
 	DT_RASPRINTER	ラスタプリンタ
 	DT_RASCAMERA	ラスタカメラ
 	DT_CHARSTREAM	文字ストリーム
 	DT_METAFILE	メタファイル
 	DT_DISPFILE	ディスプレイファイル
 	hdc パラメータで拡張メタファイルのデバイスコンテキストのハンドルを指定した場合、CreateEnhMetaFile 関数を呼び出したときに指定した参照デバイスのデバイステクノロジが返ります。hdc パラメータで指定したオブジェクトが拡張メタファイルのデバイスコンテキストかどうかを調べるには、GetObjectType 関数を使います。

HORZSIZE	ミリメートル(mm)単位の画面の物理的な幅。
VERTSIZE	ミリメートル(mm)単位の画面の物理的な高さ。
HORZRES	ピクセル単位の画面の幅。
VERTRES	ピクセル単位(ラスタ行数)の画面の高さ。
LOGPIXELSX	画面の水平方向での、論理インチ当たりのピクセル数。マルチモニタを接続しているシステムでは、すべてのモニタでこの値が等しくなります。
LOGPIXELSY	画面の垂直方向での、論理インチ当たりのピクセル数。マルチモニタを接続しているシステムでは、すべてのモニタでこの値が等しくなります。
BITSPIXEL	ピクセルあたりのカラービットの数。
PLANES	カラープレーンの数。
NUMBRUSHES	デバイス固有のブラシの数。
NUMPENS	デバイス固有のペンの数。
NUMFONTS	デバイス固有のフォントの数。
NUMCOLORS	デバイスのカラー深度が 8bpp(ピクセル当たり 8 ビット)以下の場合は、デバイスのカラーテーブル内のエントリ数を取得します。色深度が 8bpp を超える場合、-1 が返ります。
ASPECTX	線の描画に使うデバイスピクセルの相対的な幅。
ASPECTY	線の描画に使うデバイスピクセルの相対的な高さ。
ASPECTXY	線の描画に使うデバイスピクセルの対角線の幅。
PDEVICESIZE	予約済み。
CLIPCAPS	デバイスのクリッピング能力を示すフラグ。デバイスが長方形のクリップをサポートする場合は 1、それ以外の場合は 0 です。
SIZEPALETTE	システムパレット内のエントリ数。デバイスドライバが、nIndex パラメータの RASTERCAPS インデックスで RC_PALETTE ビットをセットした場合にのみ、SIZEPALETTE インデックスは有効です。また、ドライバが 16 ビット版の Windows との互換性を備えている場合にのみ、利用できます。
NUMRESERVED	システムパレット内の予約エントリ数。デバイスドライバが、nIndex パラメータの RASTERCAPS インデックスで RC_PALETTE ビットをセットした場合にのみ、NUMRESEVED インデックスは有効です。また、ドライバが 16 ビット版の Windows との互換性を備えている場合にのみ、利用できます。
COLORRES	デバイスの実際の色深度を表す、ピクセル当たりのビット数。デバイスドライバが、nIndex パラメータの RASTERCAPS インデックスで RC_PALETTE ビットをセットした場合にのみ、COLORRES インデックスは有効です。また、ドライバが 16 ビット版の Windows との互換性を備えている場合にのみ、利用できます。
PHYSICALWIDTH	印刷デバイス用です。ページの物理的な幅をデバイス単位で表します。たとえば、8.5"×11" の用紙に 600dpi の解像度で印刷するよう設定されているプリンタでは、物理的な幅は 5,100 デバイス単位になります(8.5×600=5,100)。ほとんどの場合、用紙の印字可能領域は用紙の物理的な幅よりも多少小さいこと、そして印字可能領域は物理的な幅を決して上回らないことに注意してください。
PHYSICALHEIGHT	印刷デバイス用です。ページの物理的な高さをデバイス単位で表します。たとえば、8.5"×11" の用紙に 600dpi の解像度で印刷するよう設定されているプリンタでは、物理的な高さは 6,600 デバイス単位になります(11×600=6,600)。ほとんどの場合、用紙の印字可能領域は用紙の物理的な高さよりも多少小さいこと、そして印字可能領域は物理的な高さを決して上回らないことに注意してください。
PHYSICALOFFSETX	印刷デバイス用です。物理的なページの左端から印刷可能領域の左端までの距離をデバイス単位で表します。たとえば、8.5"×11" の用紙に 600dpi の解像度で印刷するよう設定されているプリンタで、用紙の左端 0.25 インチ(6.4mm)への印字が行えない場合、水平方向の物理オフセットは 150 デバイス単位になります(0.25×600=150)。
PHYSICALOFFSETY	印刷デバイス用です。物理的なページの上端から印刷可能領域の上端までの距離をデバイス単位で表します。たとえば、8.5"×11" の用紙に 600dpi の解像度で印刷するよう設定されているプリンタで、用紙の上端 0.5 インチ(12.7mm)への印字が行えない場合、水平方向の物理オフセットは 300 デバイス単位になります(0.5×600=300)。
VREFRESH	Windows NT/2000:ディスプレイデバイス用です。デバイスの現在のリフレッシュレート(垂直同期周波数)を 1 秒当たりのサイクル数(Hz)で表します。
リフレッシュレートとして 0 または 1 が返された場合、現在の周波数は、ディスプレイハードウェアの既定のリフレッシュレートに等しいかどうかを意味します。通常、既定のレートを設定するには、グラフィックカードやマザーボードの DIP スイッチ、または ChangeDisplaySettings のような Win32 の表示関数を利用しない構成プログラムを使います。
SCALINGFACTORX	プリンタの水平軸の倍率。
SCALINGFACTORY	プリンタの垂直軸の倍率。
BLTALIGNMENT	Windows NT/2000:水平方向のアラインメント(整列単位)の優先値をピクセル単位で取得します。最大の描画パフォーマンスを得るには、各ウィンドウの水平位置をこの値の整数倍に整列させるべきです。値として 0 が返った場合、このデバイスが既にアクセラレート状態になっていて、任意のアラインメントを利用できることを意味します。

SHADEBLENDCAPS	Windows 98 と Windows 2000:デバイスのシェーディング(陰影)とブレンディング(混色)の能力を示す値です。
 	SB_CONST_ALPHA	このデバイスは、 構造体の SourceConstantAlpha メンバを操作できます。この構造体は、AlphaBlend 関数の blendFunction パラメータで参照したものです。
 	SB_GRAD_RECT	このデバイスには、GradientFill 関数を使って長方形を処理する能力があります。
 	SB_GRAD_TRI	このデバイスには、GradientFill 関数を使って三角形を処理する能力があります。
 	SB_NONE	このデバイスはこれらの能力をサポートしていません。
 	SB_PIXEL_ALPHA	このデバイスには、AlphaBlend 関数を使って、ピクセルごとのアルファ(透明度、輝度)を操作する能力があります。
 	SB_PREMULT_ALPHA	このデバイスには、AlphaBlend 関数を使って、あらかじめ倍率を設定されたアルファを操作する能力があります。

RASTERCAPS	デバイスのラスタ能力を示します。次の値の組み合わせになります。
 	RC_BANDING	バンド処理のサポートが必要です。バンド処理とは、1 つのページを複数のセクション(バンド)へ分割する手法のことで、処理時間は多少長くなりますが、1 つのページを作成するために必要なメモリを削減できます。
 	RC_BITBLT	このデバイスには、ビットマップの転送能力があります。
 	RC_BITMAP64	このデバイスは、64 キロバイト(KB)より大きいビットマップをサポートしています。
 	RC_DI_BITMAP	このデバイスは、SetDIBits 関数と GetDIBits 関数をサポートしています。
 	RC_DIBTODEV	このデバイスは、SetDIBitsToDevice 関数をサポートしています。
 	RC_FLOODFILL	このデバイスには、塗りつぶしを行う能力があります。
 	RC_GDI20_OUTPUT	このデバイスは、16 ビット版の Windows 2.0 の機能をサポートしています。
 	RC_PALETTE	このデバイスは、パレットベースのデバイスとして指定できます。
 	RC_SCALING	このデバイスには、スケーリングを行う能力があります。
 	RC_STRETCHBLT	このデバイスには、StretchBlt 関数を実行する能力があります。
 	RC_STRETCHDIB	このデバイスには、StretchDIBits 関数を実行する能力があります。

CURVECAPS	デバイスの曲線描画能力を示します。次の値の組み合わせになります。
 	CC_NONE	このデバイスは、曲線をサポートしていません。
 	CC_CHORD	このデバイスは、弓形(弧と弦からなる図形)の弧を描画できます。
 	CC_CIRCLES	このデバイスは、円を描画できます。
 	CC_ELLIPSES	このデバイスは、楕円を描画できます。
 	CC_INTERIORS	このデバイスは、内部の塗りつぶしを行えます。
 	CC_PIE	このデバイスは、扇形を描画できます。
 	CC_ROUNDRECT	このデバイスは、角の丸い長方形を描画できます。
 	CC_STYLED	このデバイスは、スタイル付きの境界線を描画できます。
 	CC_WIDE	このデバイスは、太い境界線を描画できます。
 	CC_WIDESTYLED	このデバイスは、スタイル付きの太い境界線を描画できます。

LINECAPS	デバイスの直線描画能力を示します。次の値の組み合わせになります。
 	LC_NONE	このデバイスは、直線をサポートしていません。
 	LC_INTERIORS	このデバイスは、内部の塗りつぶしを行えます。
 	LC_MARKER	このデバイスは、1 個のマーカーを描画できます。
 	LC_POLYLINE	このデバイスは、連続直線を描画できます。
 	LC_POLYMARKER	このデバイスは、複数のマーカーを描画できます。
 	LC_STYLED	このデバイスは、スタイル付きの直線を描画できます。
 	LC_WIDE	このデバイスは、太い直線を描画できます。
 	LC_WIDESTYLED	このデバイスは、スタイル付きの太い直線を描画できます。

POLYGONALCAPS	デバイスの多角形描画能力を示します。次の値の組み合わせになります。
 	PC_NONE	このデバイスは、多角形をサポートしていません。
 	PC_INTERIORS	このデバイスは、内部の描画を行えます。
 	PC_POLYGON	このデバイスは、交互モードの塗りつぶしを行えます。詳細については、SetPolyFillMode の解説を参照してください。
 	PC_RECTANGLE	このデバイスは、長方形を描画できます。
 	PC_SCANLINE	このデバイスは、単一の走査行を描画できます。
 	PC_STYLED	このデバイスは、スタイル付きの境界線を描画できます。
 	PC_WIDE	このデバイスは、太い境界線を描画できます。
 	PC_WIDESTYLED	このデバイスは、スタイル付きの太い境界線を描画できます。
 	PC_WINDPOLYGON	このデバイスは、全域モードでの多角形の塗りつぶしを行えます。詳細については、SetPolyFillMode の解説を参照してください。

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	このデバイスは、キャラクタの整数倍のスケーリング(n 倍角)を行えます。
 	TC_SA_CONTIN	このデバイスは、キャラクタの任意の倍率のスケーリングを行えます。
 	TC_EA_DOUBLE	このデバイスは、2 倍の太さの文字(太字)を描画できます。
 	TC_IA_ABLE	このデバイスは、イタリック体を描画できます。
 	TC_UA_ABLE	このデバイスは、下線を描画できます。
 	TC_SO_ABLE	このデバイスは、取り消し線を描画できます。
 	TC_RA_ABLE	このデバイスは、ラスタフォントを描画できます。
 	TC_VA_ABLE	このデバイスは、ベクトルフォントを描画できます。
 	TC_RESERVED	予約済みです。このフラグは必ず 0 になります。
 	TC_SCROLLBLT	このデバイスは、ビットブロック転送(ブリット)によるスクロールを行えません。このフラグが、予期とは逆のことを意味する可能性があることに注意してください。

COLORMGMTCAPS	Windows 2000:デバイスの色の管理(カラーマネジメント)能力を示します。
 	CM_CMYK_COLOR	このデバイスは、CMYK(シアン、マゼンタ、イエロー、ブラック)のカラースペース(色空間)に基づく ICC(International Color Consortium)のカラープロファイルを受け入れます。
 	CM_DEVICE_ICM	このデバイスは、デバイスドライバまたはデバイスの側で ICM(イメージ色の管理)を実施できます。
 	CM_GAMMA_RAMP	このデバイスは、 と の各関数をサポートしています。
 	CM_NONE	このデバイスは、ICM をサポートしていません。


かなり数があるので必要なものだけ使ってください。
以下のコードは画面の幅と高さを取得して表示するコードです。

#include <windows.h>
#include <stdio.h>

#define MSG(m) {\
	MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
	char buf[1000];

	HDC hdc;

	switch(msg){
		case WM_DESTROY:

			PostQuitMessage(0);
			return 0;

		case WM_LBUTTONDOWN:

			hdc = GetDC(hwnd);

			sprintf(buf,"幅は:%dpx、高さは:%dpxです。",GetDeviceCaps(hdc,HORZRES),GetDeviceCaps(hdc,VERTRES));

			MSG(buf);
		
			ReleaseDC(hwnd,hdc);

			return 0;

		
	}
	return DefWindowProc(hwnd,msg,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	MSG msg;
	WNDCLASS wc;

	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hCursor=wc.hIcon=NULL;
	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.lpszClassName="test";
	wc.lpszMenuName=NULL;
	
	if(!RegisterClass(&wc)){
		MSG("クラスの登録失敗");
		return -1;
	}

	
	//インスタンスハンドル
	hinst=hInstance;

	hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		0,0,400,400,NULL,NULL,hInstance,NULL);


	if(hwnd==NULL){
		MSG("ウィンドウ作成失敗");
		return -1;
	}


	//エラーチェック用変数
	int check;

	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

	//クラス解放
	UnregisterClass("test",hinst);

	return 0;

}

これを実行して、クライアント領域上で左クリックすると、
PCの画面の幅と高さを表示します。

次回はシステム情報取得について説明します。


>> 【システム情報の取得】に進む
>> WINAPI入門トップに戻る