第4章 ウィンドウを作る その4


まず、ちょっとだけメッセージについて説明します。 メッセージが発生するのは、次の4つの場合であると いわれています。

1.ユーザーが引き起こすイベント(キーボード入力、マウス操作など) 2.自分自身が発生させる 3.ウィンドウズから発生する 4.他のアプリケーションより

メッセージの種類は、山のようにあります。 筆者は知らないメッセージの方がずっと多い。 しかし、よくたとえ話として入門書に書いてありますが 「プログラマは湖の氷に穴をあけて魚釣りをしている人」 です。釣り人は湖に住んでいる魚のすべてを知る必要はありません。 必要な魚を釣ってさえいればよいのです。メッセージも自分が 必要ものだけを罠を仕掛けて待っていればよいのです。

さて、メッセージについては前章でWM_PAINTについてほんの少しだけ書きました。 ウィンドウを描き直す必要があるとき発生します。ウィンドウを描き直す必要があるとき とは、どんなときでしょうか。

ウィンドウを作って画面に表示したとします。そして、そのウィンドウに 「猫でもわかるプログラミング」と表示したとします。 しかし、ユーザーの気まぐれで別なソフトを起動して、今作ったウィンドウを 覆い隠してしまうとします。せっかく画面にウインドウと文字列を表示したのに 別なソフトのウィンドウで消されてしまいました。そして、またまたユーザーの 気まぐれでそのソフトが終了しました。すると、自分で作ったウィンドウは消されたままです。 これではいけません。 こーいう時にWM_PAINTメッセージが発生します。(発生するというか、 送られてくるというか・・・)そうするとウィンドウを描き直して元通りになるという 仕組みです。そのほかにも、何か自分で新しく表示するときも描き直す必要がありますね。 と、いうことでWM_PAINTメッセージは文字とか図形を表示させたいときに関係のある メッセージだということは何となくわかってきたでしょうか。

では、プロシージャの所を見てみましょう。 ここは、メッセージ処理の場所です。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); }

WndProc関数の前についているLRESULTとかCALLBACKについては今の段階では 無視して下さい。ここでは、メッセージmsgをswitch文で処理しています。 WM_DESTROYメッセージ(ウィンドウ破棄メッセージ)が来たら PostQuitMessage関数によりWM_QUITを送り出しWinMain関数のループを 終了させます。他のメッセージが来たときはDefWindowProcにより デフォルト処理をさせます。

折角ですから、プロシージャを少し変えてウィンドウに文字を表示させてみましょう。 文字の表示については次回詳しく解説します。WM_PAINTメッセージを受けるところに 文字表示のプログラムを書けばよいですね。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: ShowMyText(hWnd); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); }

WM_PAINT:の所を見て下さい。WM_PAINTメッセージが来たら ShowMyText関数(自作関数)を実行しなさいということですね。 テキスト表示にウィンドウハンドルが必要なので引数にhWndを取っています。 プログラムの最初の方にこの関数のプロトタイプ宣言を書いておきましょう。

void ShowMyText(HWND);

としておけばよいですね。 では、この関数の中身を次に示します。 意味は次回解説します。

void ShowMyText(HWND hWnd) { HDC hdc; PAINTSTRUCT paint; char *str = "猫でもわかるプログラミング"; hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); EndPaint(hWnd, &paint); return; }

strlen関数を使う関係上string.hもインクルードしておいて下さい。

たかが、テキストを表示するだけで面倒くさいな!

ま、ワンパターンの書き方が多いのでそのうち慣れます。 それと、変数名はあんまりウィンドウズの規則にとらわれずに C言語でDOSのプログラムを書くときみたいに気楽に使ってます。 (本当はよくない!でも慣れないうちは無理しないで 自分の慣れた方法でやって下さい。)

左の図のようになれば、大成功です。(ウィンドウは縮めてあります)


[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Mar/18/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。