OriosのActiveBasic講座(2-1): ウィンドウパーツ
1.スケルトンウィンドウ

c.解説

[4] メッセージループ & 終了作業部

' メッセージループ While GetMessage(lpMsg, 0, 0, 0) > 0 TranslateMessage(lpMsg) DispatchMessage(lpMsg) Wend ' 終了 DeleteObject(hBrush) End
【ここでやること】
ウィンドウメッセージを受け取ってコールバック関数に送ります。
【詳しい説明】
(1) ウィンドウメッセージ
(a) ウィンドウメッセージとは?
ウィンドウメッセージというのは、「マウスがクリックされた」「閉じるボタンが押された」「ボタンが押された」などのことをウィンドウに伝えるメッセージのことです。
(b) GetMessage関数
「GetMessage関数」は、どんなウィンドウメッセージが来ているかをチェックする関数です。
GetMessage(MSG構造体 , 0, 0, 0)
第2パラメータ以降は今は必要ないので「0」を指定してください。 ここで気をつけておきたいのは、「GetMessage関数」の戻り値です。
  • 普通のメッセージを受けたときは「1」
  • 「ウィンドウ処理を終了する」というメッセージの場合は「0」
  • 何かエラーが起きたときは「-1」
普通のメッセージのときは、その後もメッセージが来るかもしれませんが、「ウィンドウを終了する」とか「エラー」だった場合は、これ以上メッセージを受け取る必要がありません。 なので、ここのループは「GetMessage(lpMsg, 0, 0, 0) > 0」のように0を超える場合にループを続けるようにします。
(c) TranslateMessage関数
この関数の意味を知る必要はない(というか私もよく分かりません。)ので、とりあえずメッセージを処理するのに必要なのだと思ってください。
TranslateMessage(MSG構造体 )
(d) DispatchMessage関数
この関数は、実際に受け取ったウィンドウメッセージを処理するための関数(コールバック関数)を呼び出すためのものです。 これがないと、メッセージを受け取るだけで実際に処理ができなくなるので、絶対に必要です。
DispatchMessage(MSG構造体 )
(2) 終了処理
( ) ブラシの解放
[2]でウィンドウ背景用にブラシを作ったと思いますが、プログラムが終わればこのブラシも必要なくなるので、このブラシを片付ける必要があります。 作ったブラシを片付けるには「DeleteObject関数」を使います。
DeleteObject(片付けたい物のハンドル )
これを忘れると、メモリー上にいつまでもブラシのデータが残ってしまい、メモリーを無駄遣いしてしまうのできちんとしてください。 ただ、ウィンドウが表示されている間に消すと、途中から背景色が正常に表示されなくなるので注意してください。

[5] コールバック関数

' コールバック関数 Function MainWndProc(hWnd As HWND, wMsg As DWord, wParam As DWord, lParam As DWord) As Long Select Case wMsg Case WM_CLOSE DestroyWindow(hWnd) Case WM_DESTROY PostQuitMessage(0) Case Else MainWndProc = DefWindowProc(hWnd, wMsg, wParam, lParam) Exit Function End Select MainWndProc = 0 End Function
【ここでやること】
送られてきたウィンドウメッセージを処理します。
【詳しい説明】
( ) コールバック関数
(a) コールバック関数とは?
ここよりも前にも少し説明しましたが、コールバック関数とは「ウィンドウメッセージを処理する関数」です。 例えば「ボタンを押されたら作業Aをする」のようなことをプログラムですると思いますが、コンピュータ(OS)自身は「ボタンが押されたよ」などウィンドウメッセージしか送ってくれません。 実際に作業Aができるようにするには、「ボタンが押されたときに作業Aをする」というプログラムを組む必要があります。 そのようなプログラムを組むのが「コールバック関数」です。
(b) 引数
コールバック関数には4つの引数が送られてきます。
  • 第1パラメータ(ウィンドウハンドル):どこのウィンドウからのメッセージか
  • 第2パラメータ(メッセージ):どんな種類のメッセージか
  • 第3パラメータ(パラメータ1):付加情報1
  • 第4パラメータ(パラメータ2):付加情報2
ウィンドウを1つしか作らない場合は第1パラメータ(ウィンドウハンドル)は必要ないので、コールバック関数は第2パラメータ(メッセージ)を「Select Case」などを使って場合分けします。
(c) WM_CLOSEメッセージ
ウィンドウの左上についている「閉じるボタン」が押されたときに呼び出されます。 実は「閉じるボタン」が押されるだけではウィンドウは閉じられません。 なので、このメッセージが送られてきたら「DestroyWindow関数」を使ってウィンドウを閉じてやります。
DestroyWindow(閉じたいウィンドウのハンドル )
ここで「閉じたいウィンドウのハンドル 」には、コールバック関数の第1パラメータを使用します。 仮にウィンドウを作ったときの「CreateWindowEx関数」の戻り値のハンドルなどを使用すると、2つ以上のウィンドウを扱うときに、閉じないといけないウィンドウと違うものを閉じる可能性があるからです。
(d) WM_DESTROYメッセージ
ウィンドウが閉じられたときに送られてきます。 実は、ウィンドウが閉じられただけではウィンドウ処理を終わることはできません。 ウィンドウ処理を終わらせるには、先ほど[4]で書いた「ウィンドウ処理を終了する」というメッセージを「PostQuitMessage関数」を使って送る必要があります。
PostQuitMessage(0)
パラメータには「0」を指定してください。
(e) DefWindowProc関数
実は、ウィンドウメッセージは上に挙げた2つ以外にも、さまざまなものが送られてきます。 しかし、そのウィンドウメッセージを全部自分で処理することはほぼ不可能です。 なので、OSがデフォルトの処理を用意しているものについては「DefWindowProc関数」を使って、OSに処理をさせてしまいます。
DefWindowProc(ウィンドウハンドル , メッセージ , パラメータ1 , パラメータ2 )
パラメータは、要はコールバック関数で受け取ったやつをそのままコピーすれば構いません。
(f) コールバック関数の戻り値
自分で作る「コールバック関数」も、「関数」という名だけあって、戻り値を設定しなければなりません。 この戻り値というのは、コールバック関数が正常に処理したかをコンピュータが判断する材料になります。 なので、自分で処理するメッセージ(この場合"WM_CLOSE"と"WM_DESTROY")のときは「0」、OSに処理を任せた場合は「DefWindowProc関数」の戻り値にします。

前ページ - 次ページ

ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

ホーム > OriosのActiveBasic講座(トップページ) >