前回までを通して Windows 環境下において 窓 を実装するための手法(具体的には二つばかしの Windows API ですが)を紹介しました。しかしこれらは基本的には単純な 窓 を実現させるための簡易版 API となります。 そこで今回はいよいよ正規の 窓 を実装します。 さて、まずは論ずるよりも先に 窓 を実装するためのコードを見てください!
どうでしょうか? 長い?いえいえ、これぐらいの長さで凹たれないでください。実際にまともなアプリを作成すれば、コードステップ数なんぞ1000や2000行は軽く超えますので ひとまず何も考えず上記のコードを黙ってコンパイルしてみてください。 すると下のような 窓 が現われたはずです。 如何ですか?無事に 窓 は表示されましたか? 何はさておき、これでようやく真っ当な window の実装が実現できたはずです。 何もしない単純な 窓 ですが、前回までで紹介した MessageBox 関数、DialogBox 関数などとは違い、今回のコードはモノ本の 窓 を実装するコードになります。 余力のある方はじっくり上のコードを読んで解析してみてください。 では、ここからコードの解説を行います。 上のコードは単純に以下に示すようなパートによって構成されています。
この辺りは前回までで極めているはずなのでサックっと行きましょう。 次ぎに行う作業は、ウィンドウクラスの定義と登録になります。 具体的には、定義した WNDCLASS 構造体のフィールドにウィンドウの性質を決定する値を格納する作業を「ウィンドウクラスの定義」とここでは呼びます。 続いて RegisterClass 関数を用いて定義したウィンドウクラスを登録します。 いよいよウィンドウを作成します。 まずは CreateWindow 関数を用いて登録されたウィンドウクラスを基にウィンドウを生成します。 次ぎに続くステップで待望のウィンドウを画面上に表示させます。 API の呼び出し手順は、CreateWindow 関数で取得したハンドルを ShowWindow 関数に渡します。この時点でようやくウィンドウが画面上に表示されます。あとはおまじないとして UpdateWindow 関数を噛ましておいてください。 さて、ウィンドウが表示されたからと言って、まだまだ油断は禁物です。 行うべき作業はまだ残っています。 表示されたウィンドウ上で発生した事象(イベント / メッセージ)を受け取るべき受皿を用意します。 それが「メッセージループ」と「メッセージ処理」の箇所になります。 「メッセージループ」とは、この場合、while ステートメントで廻り続けるループ箇所を示し、具体的にはウィンドウ上で発生した作用が PeekMessage 関数によってアプリケーション側に取得され、TranslateMessage 関数で内容が解釈され、 DispatchMessage 関数を通して一旦システムにシークエンスを返し、システム側から「メッセージ処理」部分を呼び出してもらいます。 後はプログラマーが「メッセージ処理」上に具体的なコードを書き、ウィンドウ上に行われた行為に対する処理を決定していきます。 ちなみに途中で出て来たお呪いである UpdateWindow 関数を補足として説明しておきますと、この関数の役割はウィンドウにWM_PAINTメッセージを送って、そのクライアント領域を更新させます。 さて、window を実装するためのコードを紹介し終えたところで話しを終えさせていただきます。 Windows プログラミングの基本はここから始まりますので、実際には Windows アーキテクチャの真髄を極めるには、ここから深追いするべきところでしょうが、今回の目的・主眼があくまでも 窓 を実装する点にあります。だから Windows アーキテクチャを解説するような話題は敢えて避けさせていただきました。 まぁ、いずれ機会があったらご紹介するつもりですので、詳しい話しは「今回はなし」っということにしてください。 では、また 高松 恵 2000/11/03 文化の日(旗日)になにやっているんだろうな〜 |
// ウィンドウ クラスを登録 wndClass.style = 0; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_WINLOGO)); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = COLOR_BACKGROUND; wndClass.lpszMenuName = NULL; wndClass.lpszClassName = WINDOW_CLASSNAME;上の赤字の箇所を次ぎのように変更してください。