>> WINAPI入門トップに戻る
今回はデバイス情報の取得について説明します。
主にPCの画面情報を取得する関数として、
GetDeviceCaps関数があります。
第一引数には出バイスコンテキストのハンドル、
第二引数には以下の指定された定数を使います。
※以下MSDNより引用
かなり数があるので必要なものだけ使ってください。
以下のコードは画面の幅と高さを取得して表示するコードです。
これを実行して、クライアント領域上で左クリックすると、
PCの画面の幅と高さを表示します。
次回はシステム情報取得について説明します。
>> 【システム情報の取得】に進む
>> WINAPI入門トップに戻る
デバイス情報の取得
主にPCの画面情報を取得する関数として、
GetDeviceCaps関数があります。
int GetDeviceCaps(
HDC hdc, // デバイスコンテキストのハンドル
int nIndex // 能力のインデックス
);
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入門トップに戻る