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