メッセージの種類は、山のようにあります。 筆者は知らないメッセージの方がずっと多い。 しかし、よくたとえ話として入門書に書いてありますが 「プログラマは湖の氷に穴をあけて魚釣りをしている人」 です。釣り人は湖に住んでいる魚のすべてを知る必要はありません。 必要な魚を釣ってさえいればよいのです。メッセージも自分が 必要ものだけを罠を仕掛けて待っていればよいのです。1.ユーザーが引き起こすイベント(キーボード入力、マウス操作など) 2.自分自身が発生させる 3.ウィンドウズから発生する 4.他のアプリケーションより
さて、メッセージについては前章でWM_PAINTについてほんの少しだけ書きました。 ウィンドウを描き直す必要があるとき発生します。ウィンドウを描き直す必要があるとき とは、どんなときでしょうか。
ウィンドウを作って画面に表示したとします。そして、そのウィンドウに
「猫でもわかるプログラミング」と表示したとします。
しかし、ユーザーの気まぐれで別なソフトを起動して、今作ったウィンドウを
覆い隠してしまうとします。せっかく画面にウインドウと文字列を表示したのに
別なソフトのウィンドウで消されてしまいました。そして、またまたユーザーの
気まぐれでそのソフトが終了しました。すると、自分で作ったウィンドウは消されたままです。
これではいけません。
こーいう時にWM_PAINTメッセージが発生します。(発生するというか、
送られてくるというか・・・)そうするとウィンドウを描き直して元通りになるという
仕組みです。そのほかにも、何か自分で新しく表示するときも描き直す必要がありますね。
と、いうことでWM_PAINTメッセージは文字とか図形を表示させたいときに関係のある
メッセージだということは何となくわかってきたでしょうか。
では、プロシージャの所を見てみましょう。 ここは、メッセージ処理の場所です。
WndProc関数の前についているLRESULTとかCALLBACKについては今の段階では 無視して下さい。ここでは、メッセージmsgをswitch文で処理しています。 WM_DESTROYメッセージ(ウィンドウ破棄メッセージ)が来たら PostQuitMessage関数によりWM_QUITを送り出しWinMain関数のループを 終了させます。他のメッセージが来たときはDefWindowProcにより デフォルト処理をさせます。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); }
折角ですから、プロシージャを少し変えてウィンドウに文字を表示させてみましょう。 文字の表示については次回詳しく解説します。WM_PAINTメッセージを受けるところに 文字表示のプログラムを書けばよいですね。
WM_PAINT:の所を見て下さい。WM_PAINTメッセージが来たら ShowMyText関数(自作関数)を実行しなさいということですね。 テキスト表示にウィンドウハンドルが必要なので引数にhWndを取っています。 プログラムの最初の方にこの関数のプロトタイプ宣言を書いておきましょう。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); }
としておけばよいですね。 では、この関数の中身を次に示します。 意味は次回解説します。void ShowMyText(HWND);
strlen関数を使う関係上string.hもインクルードしておいて下さい。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; }
左の図のようになれば、大成功です。(ウィンドウは縮めてあります)
Update Mar/18/1997 By Y.Kumei