C++ 3日目:イベントハンドラの理解

この章では、電卓の数字や演算子が押されるといった「イベント」をきっかけに動作するイベント駆動型プログラミングと、それに反応して実行されるプログラム「イベントハンドラ」について解説します

イベント駆動型プログラミングとは

GUI(グラフィカルユーザーインターフェース)アプリケーションでは、ユーザーの操作(マウスの移動、キー入力、ボタンのクリックなど)やシステムからの信号といったイベントが発生したときに、特定の処理が実行されるようにプログラムを記述します
このようなプログラミング手法をイベント駆動型プログラミング(Event-Driven Programming)と呼びます

イベント単位で処理を記述するため、プログラムの役割が明確になり、コードの分割がしやすくなります
これにより、開発効率が向上し、メンテナンスも容易になります

イベントハンドラの役割

イベントハンドラとは、特定のイベントが発生したときに実行される処理を定義した関数です
イベント駆動型プログラミングでは、このイベントとイベントハンドラを関連付ける(紐づける)ことが不可欠です

例えば、「0」ボタンがクリックされたというイベントに対して、画面に「0」と表示する処理を記述したイベントハンドラを紐づけます

Visual C++でのイベントハンドラの追加方法

Visual C++では、イベントハンドラを簡単に追加できます

  • デザイン画面での操作:
    ダイアログエディタなどのデザイン画面で、イベントを処理したいコントロール(例: ボタン)をダブルクリックします
  • 関数の自動生成:
    Visual Studioが、そのコントロールに対応するイベントハンドラ関数を自動的に生成し、エディタに表示します
    例えば、IDC_BUTTON0というIDを持つボタンをダブルクリックすると、OnBnClickedButton0()といった関数が自動で作成されます

「0」ボタンのイベントハンドラ

以下は、0ボタンをダブルクリックして生成された関数です

void CMyCalculatorDlg::OnBnClickedButtonZero()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
}

この関数の中に0ボタンが押されたときに実行したい処理を記述します

数字ボタンが押されたとき、押された数字をテキストボックスに表示するプログラムは次の通りです

void CMyCalculatorDlg::OnBnClickedButtonZero()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
	CString strText = _T("0");

	// IDC_EDIT1 は文字を追加するエディットボックスのID
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

	// エディットボックスに新しいテキストを設定
	if (pEdit) {
		pEdit->SetWindowText(strText);
	}
}

  • CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
    Visual C++のMFC(Microsoft Foundation Classes)を用いてGUIアプリケーションを開発する場合、指定されたIDを持つコントロールのオブジェクトへのポインタを取得する必要があります
    GetDlgItem関数は、指定されたIDを持つコントロールのオブジェクトへのポインタを取得するための関数です
    CEditはエディットボックスに対応するクラス、CButtonはボタンに対応するクラスです
    これらのクラスには、テキストの取得・設定、サイズ変更、有効・無効化など、GUIを操作するための便利なメンバー関数が多数用意されています
  • if (pEdit) { ... }
    GetDlgItemが失敗してNULLポインタを返す可能性があるため、NULLチェックを行うことで、プログラムの安全性が高まります
  • pEdit->SetWindowText(strText);
    CEditクラスのSetWindowTex関数を使用して、エディットボックスに文字列をセットし、画面に表示させています

この章では、イベント駆動型プログラミングの基本概念と、Visual C++でのイベントハンドラの追加方法について学びました

【演習問題】

それでは、他の数字ボタン(1~9)についても、同様にイベントハンドラを定義し、テキストボックスに数字が表示されるようにプログラムを記述してみましょう

次回の第4日目では、電卓アプリの仕様についてさらに深く考えていきたいと思います

コメント

この記事へのコメントはありません。

関連記事

C++ 基礎編 4日目

C++ 発展編 3日目

C++ 発展編 5日目

PAGE TOP