SSブログ

Windows C++プログラミング講座 第1回 コールバック関数(関数の話) [ウィンドウズ アプリケーションのプログラミング講]


前回は、単にウィンドウを表示すると言う単純なアプリケーション(と呼べるか…)を
作ってみました。(出来たでしょうか?)

今回は、前回の最後でお話した通りに「コールバック関数」についてお話します。
また、ちょっと手を加えて


コールバック関数に、どのように手を加えてアプリケーションを作っていくか
に触れていきます。(いきなりですが…)


前回にお話したコールバック関数とは、


これです。この

LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)

この部分についてお話したいのですが、これは「関数」です。


厳密には、



この「 { 」から「 } 」で囲まれた部分を含んで「関数」です。

⇒関数についての詳しい説明(記事編集中ですゴメンなさい)


この、コールバック関数の戻り値の型は「LRESULT」ですが、これはLRESULT型なんだなって思っておいて良いと思います。

一応、説明しますとエル・リザルトと読み32bitの整数値で、S_OK / S_FALSE が値です。
意味不明でしょう?

だから、今は「LRESULT型」なんだな。と思って下さい。(それで大丈夫です)

「CALLBACK」が書いてある事によって、これはコールバック関数である事が決定します。


【そもそも「コールバック関数」ってなんだ??】


そう思うのも当たり前ですね。

コールバック関数とは、関数を呼び出す時に、別の関数のアドレスをパラメータとして渡して、呼び出した関数からパラメータとして渡された別の関数を呼び出すようにする事で、

最初に呼び出した関数から呼び出される別の関数の事を「コールバック関数」と言います。

難しいですねーーー♪


ここでは、ウィンドウズアプリケーションの開発が目的なので、
単純に、作成したウィンドウから呼び出される関数の事だと思っておいて下さい。

ただ、なんで作成したウィンドウから関数が呼び出されるかと言いますと、
作成したウィンドウに何か操作をした時に、メッセージを受け取る事が必要なんですよ。

さらに、そのメッセージを受け取って、メッセージに応じた処理をする事が必要なのです。

だから、ウィンドウを複数作った場合は、基本的にはウィンドウの数だけ
コールバック関数が必要なんです。

それぞれのウィンドウには、専用のコールバック関数が必要なんです。
それぞれのウィンドウの個別のメッセージをそのウィンドウ専用に処理するコールバック関数です。

お分かりでしょうか?


今回は、ウィンドウは一つだけ作成するので、コールバック関数も一つです。
それが、「WndProc」という名前の関数なんです。
ちなみに、「WndProc」のアドレスはちゃんとウィンドウに登録してありますよ。


【コールバック関数のパラメータ】


コールバック関数のパラメータ(引数)は、4つです。

ちょっと最初はとっつきにくいでしょうが、

(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)

この4つのパラメータが渡されます。

ちょっと分かりにくい型がならんでますよね。

HWND hWnd
UINT msg
WPARAM wp
LPARAM lp

この4つ。
慣れてしまうと、何て事はないのですが、最初はとっつきにくいと思うので、
解説しますと、

HWND hWnd

これは、HWND型。ウィンドウハンドル型です。

⇒おいおい!「型」って何だ???の方はこちら

ウィンドウの情報などを取得したり、ウィンドウを操作したり色々するのに必要なハンドルなんです。
ちょっとポインタと似た感じなのですが、ポインタとは違うと認識した方が良いです。(本当はポインタと同じですが)
あくまでハンドルです。
ウィンドウズのアプリケーションを作っていれば、すぐ慣れると思いますよ。

余りにも登場機会が多いので…

《ちょっと余談》

HWNDは、ウィンドウハンドルなのですが、結局はポインタなんです。でも、OSが管理する内部の情報のために、プログラマが参照する事が許されていません。
あくまで、各ウィンドウのオブジェクトを識別するためのものなのです。

(余談終わり)


UINT msg

これは、UINT型の変数「msg」の宣言ですが、UINT型とは符号なし32bit整数と言う意味です。要するに正の整数と言う意味ですね。

この変数「msg」には、実際のウィンドウメッセージが渡されます。

私たちは、この「msg」の受け取った整数値を調べることにより、ウィンドウにユーザーがどんな操作をしたか分かります。

「msg」の値に応じた処理をプログラムする事で、アプリケーションに機能を付けていくのです。
この作業が最もメインな作業となる事でしょう。


WPARAM wp
LPARAM lp

この2つのパラメータは、今は気にしなくて良いと思います。
「msg」には、メッセージを識別する値。そして、WPARAM型の「wp」とLPARAM型の「lp」に何らかのデータやパラメータを加えることがあるのです。

メッセージによっては、パラメータがある事があると言うわけです。
これは、必要な時に使ってみて理解するのが好ましいと思います。

今の段階では、こんなパラメータがあるんだなと思っておいて下さい。


【最低限の覚える事】


HWND hWnd
UINT msg

この2つのパラメータの事が、なんとなく分かれば良いと思います。

HWND hWnd これは、ウィンドウハンドル

UINT msg これは、メッセージが渡されます。

これで、最低限の事は出来るのです。


【コールバック関数をもう一度見てみましょう】




コールバック関数は分かったけど、関数の内部に色々書いてありますね。




これです。

switch(msg)

と書いてあって、なにやら書いてありますが、これは「switchステートメント」と言います。
変数「msg」は、ウィンドウメッセージが渡されて記憶されています。
記憶されている値は、整数です。

switchステートメントとは、()内の変数の値によって「条件分枝」を行う事が出来ます。
コードの書式は、




こんな書式です。
「テスト式」の部分の値によって、分枝します。
「式1」、「式2」の部分には 0や1などの整数値が入ります。

「テスト式」の値によって対応するサブステートメントが実行されます。
対応する値が存在しない場合は全て「default」の部分が実行されます。

分かりやすく書き直してみると、






こんな感じになります。なんとなくお分かりでしょうか?
あっ。ちなみに、自分でコレ書けるようにならなくて大丈夫ですよ。
どうせコピペだし、自然に書けるようになってくるし、学校の勉強ではないので、コレ見て意味が分かればOKです。


では、コールバック関数の「switch(msg)」に戻ります。





switch(msg)の中身は、

case WM_DESTROY:



default:

って言うのがありますよね。

「default」って言うのは、対応する条件が無かった場合全部ここを実行する部分なので気にしなくて大丈夫です。

WM_DESTROY

って言うのは何かと言いますと、ウィンドウを破棄するときに送信されるメッセージなんです。

簡単に言うと、ウィンドウの右上の「×ボタン」を押すとこのメッセージがコールバック関数に送信されるのです。

ちなみに、「WM_DESTROY」と言う文字には、「2」と言う値が割り当てられています。
どう言う事かと言いますと、

case WM_DESTROY:

と書くと、

case 2:

と書いたのと同じ意味なんです。
何で「WM_DESTROY」と書くかと言いますと、メッセージの内容が分かりやすいからです。
「2」とかの数値だと、何のメッセージの処理を書いた部分か分からなくなるんです。

「WM_DESTROY」だと、WMコレはウィンドウメッセージと言う意味。
ウィンドウの破棄のメッセージと言う意味だとなんとなく分かるように、このように書きます。

この、

case WM_DESTROY:

の部分には、

PostQuitMessage(0);

と書いてありますが、アプリケーションを終了するメッセージを送信する関数なんです。

ここの意味は、ウィンドウを閉じる操作をした場合は、アプリケーションを終了されると言うコードが書いてあるのです。


「default」の部分には、

return (DefWindowProc(hWnd , msg , wp , lp));

と書いてあります。

これは、OS管理する所のデフォルトのウィンドウのプロセスに戻ると言う命令です。
パラメータも受け取ったまま返してあります。


【結局何すれば良い?】


結局ですね、今まで見てきたコールバック関数って、書き換える必要なんてないんですよ。
書き加える事はあっても書き換える事は、最初はほとんどありません。

このまま使います。

もう一度、コールバック関数を見てみましょう。




実は、私達は「// メッセージ処理」とかかれたところに、
色々なウィンドウメッセージに応じた




こういう物を書き加えていくだけなんです。

ウィンドウメッセージは沢山あって、既に値が割り当てられていますが、
私達は、値についてはあまり意識しなくて大丈夫なのです。





せっかくだから、何かやってみましょう。

と言うわけで、ウィンドウを左クリックしたときに発生するメッセージを
追加してみましょう。

どこに追加するかと言いますと、

「// メッセージ処理」と書かれた部分に挿入する形で書きます。
それ以外は、全くいじらなくていいです。





追加したのは、




これですが、

「case WM_LBUTTONDOWN」これはわかりますよね。
左クリックした時に発生するメッセージを処理する所です。(ちなみに値は513ですが)

MessageBox(NULL , "左クリックしたよ\r\nHello World!\r\nじゃないよ!" , "楽しいトレンドニュース" , MB_OK);

これは、メッセージボックスを表示する関数です。これを実行すると

HelloWorld.jpg

こんなメッセージボックスが表示されます。



(これは書きかけです。まだ未完成です。ゴメンなさい…)




nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。