パソコン活用研究C&C++であそぼ(C、C++、の活用研究)

正しくないWindowsプログラム−とりあえずウィンドウを表示する
--ウィンドウの作成と表示--

Windowsプログラムの正しい雛形について、枠組みだけざっとおさらいしておきます。

下記がいわゆるWindowsプログラムの”正しい”雛形の枠組みでした。
//(1)Winmain
WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
}
// ウィンドウクラス構造体を設定

//(A) ウインドウクラスの登録
RegisterClassEx

// (B)ウインドウを作成
CreateWindow

//(C) ウインドウを表示
ShowWindow
UpdateWindow

//(D) メッセージループ

//(2) ウィンドウプロシジャ
WndProc (
HWND hWnd,
UNIT message,
WPARAM wParam,
LPARAM lParam )
{
}

今回は、WinMainのなかの(A),(B),(C)だけをもったプログラム(すなわち、(D)メッセージループと(2)ウィンドウプロシジャがないプログラム)で、とりあえずウィンドウを表示させてみたいと思います。(D)メッセージループと(2)ウィンドウプロシジャがないプログラムというのは、言ってみれば不完全なプログラムで、”正しい”雛形ではないのですが、ウィンドウの表示という観点からすると、この不完全なプログラムを一度経験してみると、”正しい”雛形の理解もすすむと思います。

不完全プログラムその1
下記のstatic.cppは”正しい”雛形に比べると、メッセージループもウィンドウプロシージャもなくて、非常に短いプログラムになっています。しかもウィンドウクラス構造体の設定も、ウィンドウクラスの登録もありません。ただ、ウィンドウを表示させるだけの最低限の記述をするとこんな感じになります。これなら簡単な感じがしますね。

static.cpp
#include<windows.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {

HWND hwnd = CreateWindow(
TEXT("STATIC") , NULL ,
WS_BORDER ,
100 , 100 , 200 , 200 , NULL , NULL ,
hInstance , NULL
);

if (hwnd == NULL) return 0;

ShowWindow(hwnd , SW_SHOW);

//すぐに終了させないためにMeesageBoxを表示する
MessageBox(NULL , "" ,
"" , MB_ICONINFORMATION);

return 0;
}

順をおってコードをみていきましょう。まずあの長々としたウィンドウクラス構造体の定義をしていません。CreateWindow関数の第一引数(ウィンドウクラス名)を見て下さい。、今回は"STATIC"になっています。これは実はOSに定義済みのウィンドウ構造体です。従って、ウィンドウクラス構造体の定義を自分でする必要はなかったわけです。従ってウィンドウクラスの登録も不要ですね。あとは、特にこれといった設定もしていません。徹底的に定義済みのものを利用することで、こんなに簡単になってしまいました。

*補足
Windowsプログラムの正しい雛形(中篇)では、自分でウィンドウクラス構造体を定義し、ウィンドウクラスの登録もしていました。従ってCreateWindow関数の第一引数では、自分で定義したウィンドウクラス構造体のウィンドウクラス名を指定していました。

なお、今回CreateWindow関数の第一引数(ウィンドウクラス名)は"STATIC"にしていますが、"STATIC"は文字列やビットマップを表示することができるウィンドウクラスです。第二引数を"NULL"にしていますが、ここに文字列を指定すると、その文字列を表示します。

定義済みのウィンドウクラス名としては、有名どころでは以下のようなものがあります。
"BUTTON"  ボタンコントロール
"EDIT"    エディットコントロール
"LISTBOX" リストボックス


その後、ShowWindow関数でウィンドウを表示させて終わりです。たったこれだけで終わりです。”正しい”雛形のながったらしさに比べたらあっけない短さですね。
その後のMessageBox関数は、今回のプログラムでは本質的なものではありません。これがないと、一瞬ウィンドウを表示してすぐにプログラムが終了してしまうので、いったん停止するために、MessageBoxを呼んでいます。

正しい雛形に比べると、徹底的に省けるものは省いてしまったので、こんな簡単なプログラムになってしまいました。では、このプログラムを実行してみましょう。

下図の左側の何もないウィンドウがShowWindow関数で表示させたウィンドウです。このウィンドウはクリックしても、キーボードを押しても何も反応しません。ドラッグ&ドロップで移動させることも、サイズを変えることも何もできません。そういう機能は全て省略してただ表示されているだけですから。

*補足
右のメッセージボックスはMessageBox関数で表示しているものです。今回のプログラムでは終了を一時停止させるための付けたしです。メッセージボックスの[OK]をクリックすると、このプログラムが終了して、左側のウィンドウの表示も消えます。


ようやく、まったく無意味なウィンドウではありますが、ウィンドウを表示させることができました。これで、GUIプログラムもかなり身近に感じるようになったのではないでしょうか。これで、Windowsプログラムに登る道筋が少し見えた感じですね。やったー。

ただ、ウィンドウを表示させるだけなら、極限まで省くとこんな短いプログラムになります。今回の部分がウィンドウを表示させる骨の部分になります。ま、こんなウィンドウを表示させてもまったく無意味ですので、Windowsプログラムの正しい雛形では、長々といろんな機能を記述をして、もっとまともに反応するウィンドウを作っているわけです。

TopPage