コントロール、メニューの使用法

前節までで出来上がったプログラムtestdlg.zipを実行すると、次のようなダイアログが表示されます。

ここで、電流を入力するエディット ボックスに値を入れて、その左にある”設定”ボタンを押すと、その値が記憶され、ついでメニューの”点灯”を選択すると、その記憶された値が、状態という場所にある電流値を示す2つの”スタティック テキスト”(Static Aと書かれたところ)に表示されるようなプログラムにしてみましょう。


コントロールIDの設定

まず、使用するコントロールのID(各コントロールを区別するための認識文字列:identification;ファイルresource.hを見ると本当は認識番号であることが分かります)を用途が想像できるものに変えます。

VC++を起動して、ワークスペース ウィンドウの下方にある3つのタブのうちResource Viewタブをクリックすると、ワークスペースに含まれているリソースが表示されます。そこで、Dialogをダブルクリックして、さらにIDD_TESTDLG_DIALOGをダブルクリックします。すると、ダイアログ編集画面が現れます。

ここで、電流を入力するエディット ボックスにマウスカーソルを移動して、右クリックします。すると以下のようなポップアップ メニューが開きます。

ここで、プロパティを選択してクリックすると、

のようにEDITプロパティが現れます。そして

のようにコントロールIDをIDC_EDIT2からIDC_CURRENTに変更します(変更しなくても良いのですが、用途が想像できるIDが記憶しやすいでしょう)。

同様な操作により、エディット ボックスの右隣の設定ボタンのIDをIDC_BUTTON1からIDC_SETに、状態の所にある電流と書かれた右隣のスタティック テキストのIDをIDC_STATICからIDC_CURRENT1に、またその隣のスタティック テキストのIDをIDC_STATICからIDC_CURRENT2に変えます。


設定ボタンのハンドラ関数の作成

電流を入力するエディット ボックスの左にある設定ボタンをマウスでクリックすると、Windowsは適当なときにメッセージBN_CLICKDをウィンドウに送ります。このメッセージに対応して働くハンドラ関数を追加する必要があります。ダイアログ編集画面で、設定ボタンを右クリックすると、つぎのようなポップアップ メニューが開きます。

ここでClassWizardを選択すると、次のようなMFC ClassWizardというダイアログが現れます。

クラス名がCTestdlgDlgになっていることを、またオブジェクトIDの所でIDC_SET(設定ボタンのIDでしたね)が選択されていることを確認します。

ダイアログの右下にあるメッセージというリストボックスのBN_CLICKD(クリックするという意味)をダブルクリックすると、上図のように、メンバー関数の追加というダイアログ ボックスが現れます。ハンドラ関数名がOnSetになっています。そのままで良いのでOKボタンをクリックするとダイアログが消えます。さらに、ClassWizardダイアログのOKボタンをクリックして、このダイアログを消してください。

ワークスペース ウィンドウの下方にある3つのタブのうちFile Viewタブをクリックすると、ワークスペースに含まれているファイルがtree状に表示されます。そこで、Source Filesをダブルクリックして、さらtestdlgDlog.cppをダブルクリックします。すると、このプログラムの編集画面が現れます。このプログラムtestdlgDlog.cppの最後に、

void CTestdlgDlg::OnSet() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	
}
なるハンドラ関数が追加されていることを確認してください。 これで、設定ボタンをクリックすると、このハンドラ関数が呼ばれることになります。


電流を入力するエディット ボックスの値読み込み

ダイアログ編集画面を表示して、当該エディット ボックスを右クリックしてClassWizardを選択すると、MFC ClassWizardダイアログが現れます。上方にある”タブ”のうち、メンバー変数をクリックすると、下図のようになります。

ここで、エディット ボックスのIDであるIDC_CURRENTをダブルクリックすると

のようなメンバー変数の追加ダイアログが現れますので、メンバー変数を”m_current”と入力し、カテゴリーを”値”とし、そして変数のタイプのコンボ ボックスから”int”(整数型)を選択します。

これでエディット ボックスに入力する数値(整数値)がm_currentという整数変数に入る準備ができました。testdlgDlog.cppの編集画面に戻って、OnSet() の中身を

void CTestdlgDlg::OnSet() 
{
	UpdateData(TRUE);
}
とします。 UpdateData(TRUE)関数は引数をTRUEにすると、作成しているダイアログで入力したデータを取り込みます。この時点で、エディット ボックスに入力した整数値がm_currentに入ります。これで、プログラムの前半は終わりです。


メニュー(点灯)のハンドラ関数の作成

プログラムの後半に移ります。すなわち、メニューの点灯を選択すると、m_currentに記憶された値が、状態という場所にある電流値を示す2つのスタティック テキストに表示されるようなプログラムにしてみましょう。

ワークスペース ウィンドウの下方にある3つのタブのうちResource Viewタブをクリックすると、ワークスペースに含まれているリソースがtree状に表示されので、Menuをダブルクリックして、さらにIDR_MENU1をダブルクリックします。すると、メニュー編集画面が現れます。”点灯”の所を右クリックして、現れるポップアップ メニューからClassWizardを選択します。すると、クラスの追加というダイアログが出ると思いますが、無視します。つまり、キャンセルボタンを押して、このダイアログを消します。下図のようにクラス名が”CTestdlgDlg”、オブジェクトIDが”IDC_LIGHT”であることを確認した後、

メッセージというリストボックスにあるCOMMANDをダブルクリックすると、メンバー関数の追加ダイアログ ボックスが現れます。ハンドラ関数はOnLight()のままで良いので、OKボタンを押します。するとダイアログが消えます。さらに、ClassWizardダイアログのOKボタンをクリックして、ClassWizardダイアログを消してください。

プログラムの編集画面にしてください。testdlgDlg.cppの最後に、

void CTestdlgDlg::OnLight() 
{
	// TODO: この位置にコマンド ハンドラ用のコードを追加してください
	
}
なるハンドラ関数が追加されていることを確認してください。 これで、メニューの点灯を選択すると、このハンドラ関数が呼ばれることになります。そこで
void CTestdlgDlg::OnLight() 
{
	SetDlgItemInt(IDC_CURRENT1, m_current,TRUE );
	SetDlgItemInt(IDC_CURRENT2, m_current,TRUE );
}
のように2行付け加えます。m_currentに記憶された値が、状態という場所にある電流値を示す2つのスタティック テキスト(IDがIDC_CURRENT1とIDC_CURRENT2)に表示されるkことになります。実際にプログラムを実行してみましょう。なお、できあがったプログラムはtestdlg_new.zipです。

以前に述べたように、元々のプログラムはダイオード励起のQ-SWパルスレーザーの制御用に使用しています。コンピュータとパルスレーザーとはRS232Cを介して通信しています。電流値をエディット ボックスに入れて設定ボタンを押すことにより、この電流値をm_currentに入れる所までは同じです。それに加えて、関数OnSet()では、この電流値をRS232Cを介してパルスレーザに設定しています。そして、メニューの点灯を選択すると、関数OnLight() では点灯命令がパルスレーザに送られます。これにより、パルスレーザーを励起する2つのダイオードが点灯します。その後、ダイオードに”実際に”流れている電流値を送ってもらう命令をパルスレーザに出して、帰ってきた2つの電流値をスタティック テキスト(IDがIDC_CURRENT1とIDC_CURRENT2)に表示させています。このようなレベルまで、プログラムを発展させるためには、RS232Cに関するプログラミング知識が不可欠です。インターフェースの項目を参照ください。

ダイアログには、各種、共有(common)のコントロールがすでに用意されています(コモン コントロール)。ダイアログにコントロール ツールバーから各種コモン コントロールを張り付けてみてください。それらの使用法はwebや書籍で紹介されていますので、そちらを参照ください。


戻る