●はじめに (1999/03/07 KPJ)
今回は、システム情報を調べるためのGetSystemMetrics関数について書きたいと思います。
●なぜシステム情報が必要なの?
全く同じプログラムを実行させた場合でも、パソコンによって見た目や動作が変わることがあります。
その理由は、たとえOSが同じWindowsであったとしても、それぞれのパソコンによって設定が違うからです。
パソコンによってディスプレイの解像度は簡単に変更できますし、メニューバーやスクロールバーの幅も「コントロールパネル」の画面のプロパティで変更できたりします。
このようにパソコンによってシステム情報はまちまちなので、それを調べるための関数が、Windowsでは用意されています。
●システム情報を返すGetSystemMetrics関数について
GetSystemMetricsは、

int GetSystemMetrics(int nIndex)

と定義されています。

nIndexに入れる引数は、調べたい情報によって異なります。これらの値はあらかじめ決められています。

例として、このソースコードを見てください。

このサンプルプログラムでは、ディスプレイの解像度を調べています。
ここではGetSystemMetricsは2回使われていますが、それぞれ

SM_CXSCREEN:ディスプレイの解像度(幅)
SM_CYSCREEN:ディスプレイの解像度(高さ)

を調べるために使われています。

その他にnIndexに入れる引数で、よく使われると思うものを紹介しておきます。

SM_CYCAPTION:タイトルバーの高さ
SM_CYMENU:メニューバー(1行)の高さ
SM_CXBORDER:サイズを変更できないウィンドウの境界の幅
SM_CYBORDER:サイズを変更できないウィンドウの境界の高さ
SM_CXSIZEFRAME:サイズを変更できるウィンドウの境界の幅
SM_CYSIZEFRAME:サイズを変更できるウィンドウの境界の高さ

●あとがき
実際に、GetSystemMetrics関数はプログラムでよく利用しています。

「3Dモーフィングセーバー」では、GetSystemMetrics関数で画面の解像度を調べて、解像度によって画面の表示を制御しています。 画面の解像度を変えながら「3Dモーフィングセーバー」を起動してみるとわかるかもしれませんね。

また、「クイズ3」では、GetSystemMetrics関数でメニューバーの高さを調べています。 「クイズ3」はノートパソコンユーザであっても利用できるように開発しました。 当時、ノートパソコンの解像度は 600*480が主流であったために、「クイズ3」の画面サイズもそれを考慮しています。 ただ、システムによってメニューバーの高さが若干異なるため、調整をする必要があったわけです。