テクニカルレシピ(Visual C++のレシピ)

Home>>Visual C++>>イベントハンドラ LastUpdate:2009-01-21

全ての操作はイベントである

イベントハンドラとは「イベント」が起きたときに呼ばれる対象をいいます。
これも具体的に見てみましょう。

Visual C++のGUIを作るにはコントロールデバイスコンテキストが重要だと説明しました。
ではボタンを押したときにこのGUIの内容を変更するのはどうすればいいでしょう。

ここで登場するのが「イベント」という概念です。
イベントというと難しく聞こえますが、要はユーザがアプリに何か操作をすることです。
閉じるボタンを押したり、最大化ボタンを押したり、自作のボタンを押したり。
これら全てがイベントで、Windowsアプリの中ではその動作に対応した処理が行われています。

閉じるボタンや最大化ボタンを押したときに呼び出される関数は予め決まっています。
このような共通動作についてはMFCが準備してくれているのです。

しかし自作のボタンを押したときに呼び出される関数は決まっていません。
そこで自作のボタンを押すというイベントに対応した関数を自作することになります。

このような関数を自作の「イベントハンドラ関数」といい、
このイベントハンドラ関数の中でデータ処理やGUI表示の処理を記述します。

ダイアログベースのイベントハンドラ

デバイスコンテキストの説明で使ったアプリにイベントハンドラ関数を追加してみましょう。
具体的にはButton1にイベントハンドラ関数を設定してみます。

ダイアログ編集画面上のButton1の上で右クリックし、
「イベントハンドラの追加」を選択してください。
すると下のようなダイアログが出てきます。

メッセージの種類が「BN_CLICKED」で、
クラスの一覧がC***Dlgになっていることを確認してください。
(***はあなたの作成したプロジェクト名になります。)

関数ハンドラ名は「OnBnClickedButton1」のまま、「追加して編集」を押します。
すると***Dlg.cppに、下のような関数が出来ているはずです。

この関数がイベントハンドラ関数になります。
プログラムを実行して画面のボタンを押すとこの関数が呼ばれます。

試しに「MessageBox(_T("Hello World"));」をTODOコメントの下に書いてみてください。
Button1押すと「Hello World」という小さいダイアログが出てくるはずです。
(MessageBoxはこのようなダイアログを表示させるためのAPIです。)

いかがですか?イベントハンドラ関数を作るのは簡単でしょう。
あとはこの関数内にコントロールやデバイスコンテキストを操作するための処理を書くだけです。

詳細は「文字表示」「計算処理」「図形描画」「画像表示」にまとめていますのでご参照下さい。

シングルドキュメントのイベントハンドラ

ダイアログベースではボタンを直感的に配置して、イベントハンドラを設定しました。
シングルドキュメントのイベントハンドラはどうやって作ればいいでしょう。

シングルドキュメントでは、「メニュー」と「ツールバー」にイベントハンドラを設定します。
下のアプリケーションを見てください。
「Hellow World」がメニューに、「HW」というアイコンがツールバーに追加されていますね。

このようなメニューやツールバーは、
Visual C++のリソースビューから追加することが出来ます。

まず下の図は「HelloWorld」をメニューに追加する場合です。
IDR_MAINFRAMEというメニューリソースを選択して下さい。
「ここへ入力」と書いてあるところに新しい項目を追加することができるので、
上段に「HelloWorld」を追加し、それをクリックしたときに「HelloWorld(H)」が出てくるようにしています。

イベントハンドラはこの「HelloWorld(H)」に対して行います。
メニュー上で右クリックをして「イベントハンドラの追加」を選択すると下のダイアログが出てきます。

メッセージの種類から「COMMAND」、クラスの一覧から「C***View」を選択して「追加して編集」を押せば、
***View.cppに下の関数が追加されます。
あとはTODOコメントの下に必要な処理を記述すればOKです。

「HW」のアイコンをツールバーに追加するのもリソースビューから行います。
IDR_MAINFRAMEを選択し、空白のアイコン(下の図だと右端)に「HW」アイコンを作成して下さい。
作成したアイコンはドラッグで位置を変更できるので、先頭に持ってきます。

この「HW」アイコンのIDを確認してください。
おそらく「ID_BUTTON・・・」といった名前がついているはずです。

この「HW」アイコンは先ほど作成した「HelloWorld(H)」のイベントハンドラを呼び出すだけです。
***View.cppのBEGIN_MESSAGE_MAPという所を探し、
ON_COMMAND(ID_BUTTON・・・, &C***View::OnHelloworldHelloworld)という記述を追加して下さい。

これで「HW」のアイコンから「HelloWorld(H)」のイベントハンドラを呼び出すことが出来るようになります。
具体的なイベントハンドラの記述についてはDoc-Viewを参照してください。

デバイスコンテキスト:前項<< ページの先頭に戻る >>次項:Doc-View