2006.7.10.
石立 喬

Visual C++ 2005 Express Edition の易しい使い方(4)

――― メニュー選択での入力と子フォームでの入力―――


 ここでは、やや本格的なWindowsプログラムを作成する方法を二種類説明する。一つは、メニューの中から数値を選んで数値を入力し、処理結果を画面に出力する。もう一つは、メニューをクリックすると別のフォーム(子フォーム、ダイアログボックス)が現れ、これに数値を入力する。これらを基礎にして、さらに本格的なプログラムに進むことができる。「易しい使い方(1)、(2)、(3)」で説明した部分は省略されているので、注意して説明を読まないと分かりにくい部分がある。

メニューを作成する方法
1) 統合開発環境のメニューから、「表示」→「ツールボックス」を選択する。
2)「メニューとツールバー」欄の「MenuStrip」をダブルクリックする。
3)「ここへ入力」と表示された場所に、順次、メニューのキャプションを入力する。
4)メニューを選択し、右クリックして、「プロパティ」を選択する。「デザイン」欄の「(Name)」の右に、自動的にメニュー名が生成されているが、これは長すぎるし、日本語でメニューのキャプションをつけた場合には、日本語がそのまま用いられるので、一般には簡略化したメニュー名に書き換える。
5)各メニューをダブルクリックすると、自動的にイベントハンドラが作成されるので、コードを記述する。

新しいフォーム(子フォーム)を追加する方法
1) 統合開発環境のソリューションエクスプローラで、プロジェクト(たとえば「C902」など)を右クリックし、「追加」→「新しい項目」を選択する。
2)「新しい項目の追加」ウインドウが開くので、
      カテゴリ -------- UI(User Interface)
      テンプレート ----- Windows フォーム
      ファイル名 ------ FormDialog (これは一例で、名前を付ける、以後もこれで説明する)
  と選択(または入力)して、「追加」ボタンをクリックする。
3)FormDialog.cpp と FormDialog.h が生成され、FormDialog のフォームデザイナ画面が現れる。
4)プロパティを下記のように設定する。
      MaximizeBox ------- False (最大化ボタンを消す)
      MinimizeBox ------- False (最小化ボタンを消す)
      FormBorderStyle --- FixedDialog (アイコンが無く、サイズの変更ができない)
      Text -------------- 「入力データの設定」(これは一例で、キャプションを付ける)
  これらは、項目を選択すると、右側に下向きの三角矢印が現れるので、これをクリックし、選択できる。

親フォームのメニューから子フォームを呼び出す方法
1) 親フォームで、呼び出しのために作成したメニューをダブルクリックする。
2)menu****_Click() メソッドが現れるので、
      FormDialog^ form_d=gcnew FormDialog();
      form_d->ShowDialog();
  と記述する。ただし、FormDialog は子フォームの名称である。
3) 親フォームの Form1.h の頭(#pragma once のすぐ下)に
      #include "FormDialog.h"
  と記述する。

子フォームで作成したデータを親フォームで使う方法
1) 子フォームで作成される変数をdouble型で a、bとすると、子フォームのFormDialog.h において、
      public: static double a,b;
  と宣言しておく。 public でなく、private にすると、親フォームクラスから呼び出せなくなり、static を省くと親フォームに渡せなくなる。
2) 親フォームから子フォームの変数を呼び出すには、
     FormDialog::a や FormDialog::b
を用いる。

◎メニューで数値を入力する場合(プロジェクト C901)

 フォームで、メニューバー上にある「Aの値」メニューをクリックすると、その下にサブメニューが現れ、「A=1」、「A=2」、「A=3」などの選択ができる。同様に「Bの値」メニューをクリックすると、その下にサブメニューが現れて、Bの値を選択できる。「演算」と名付けられたメニューをクリックすると、加減乗除を選択するサブメニューが現れ、これをクリックすると結果が表示されるプログラムを作成する。ここでは、このプロジェクトを C901と呼ぶことにする。

メニューの作成とイベントハンドラの生成
 前記の方法に従って、メニューを作成し、名前を書き換え、イベントハンドラのスケルトンを作成する。メニューのキャプション、メニュー名などをまとめて下表に示す。
 メニューの配置に関しては、図3の完成図を参照して欲しい。メニューの配置は、作成後でも、ドラッグによって変更ができる。

メニューのキャプション 自動的に付けられた名称 書き換えた名称 イベントハンドラ名
A=1 a1ToolStringMenuItem menuA1 menuA1_Click()
A=2 a2ToolStringMenuItem menuA2 menuA2_Click()
A=3 a3ToolStringMenuItem menuA3 menuA3_Click()
B=1 b1ToolStringMenuItem menuB1 menuB1_Click()
B=2 b2ToolStringMenuItem menuB2 menuB2_Click()
B=3 b3ToolStringMenuItem menuB3 menuB3_Click()
加算 加算ToolStringMenuItem menuAdd menuAdd_Click()
減算 減算ToolStringMenuItem menuSub menuSub_Click()
乗算 乗算ToolStringMenuItem menuMult menuMult_Click()
除算 除算ToolStringMenuItem menuDiv menuDiv_Click()


イベントハンドラの記述
 図1は、コードエディタ画面上に表示されたForm1.hの一部である。図で、一番上のイベントハンドラ menuA1_Click()は、「A=1」と書かれたメニューをダブルクリックすると生成される。以下のイベントハンドラも同様である。menuA1_Click() には、a=1; と記述する。
 演算のメニューの場合は、menuAdd_Click() に対して、c=a+b; と showResult(); の2行のコードを記述する。c=a+b; は選択されたメニューの内容に対する演算で、 showResult(); は結果をラベルに表示するためのメソッドを呼び出す。
 図の一番下に示した showResult() メソッドは、統合開発環境によって自動的に生成されたものではなく、全部、直接手作業で入力したものである。


図1 コードエディタ画面上の Form1.h の一部(最後尾)


変数a、b、cの宣言
 変数 a、b、c は、メニューのイベントハンドラで設定され、他のハンドラ(メソッド)から参照されるので、グローバル変数として宣言しておく必要がある。これらは、自動的ではなく、手で入力する必要がある。図2に示すように、Form1.h のコントロール関連の定義の最後に記述する。「//ここへ追加」のコメントは、説明のために付けたもので、自動的に現れるものではない。


図2 Form1.h の上方にある宣言(定義)部


最終的に得られた実行画面

 図3は、得られた実行画面を示したもので、図の左上と右上は、数値を選択するためのメニューを開いた状態を示し、左下は演算の種類を選択するメニューを開いたところである。
右下は、「除算」をクリックした場合の演算結果の一例である。


図3 得られたフォームのメニューと演算結果

◎子フォーム(ダイアログボックス)で数値を入力する場合(プロジェクト C902)

 フォームで、メニューバー上にある「入力データの設定」メニューをクリックすると、子フォームが現れ、「Aの値」と「Bの値」を入力するテキストボックスが表示される。これに入力して「設定」ボタンをクリックすると、その値が設定されて子フォームが閉じる。「取消」ボタンをクリックすると、設定しないで子フォームが閉じる。親フォームで「演算種別の選択」メニューを使用し、「実行」メニューをクリックすると、計算式と計算結果を表示する。ここでは、このプロジェクトを C902と呼ぶことにする。

メニューの作成とイベントハンドラの生成
 すでに述べた方法に従って、メニューを作成し、名前を書き換え、イベントハンドラのスケルトンを作成する。メニューのキャプション、メニュー名などをまとめて下表に示す。メニューの配置に関しては、図4、図5の完成図を参照して欲しい。

メニューのキャプション 書き換えた名称 イベントハンドラ名 イベントハンドラの内容
入力データの設定 (書き換えない) 入力データの設定Tool
StripMenuItem_Click()
ShowDialog()
加算 menuAdd menuAdd_Click() arithmeticType=0
減算 menuSub menuSub_Click() arithmeticType=1
乗算 menuMult menuMult_Click() arithmeticType=2
除算 menuDiv menuDiv_Click() arithmeticType=3
実行 menuExecute menuExecute_Click arithmeticTypeに応じて
演算して表示


 図4は、親フォームで「入力データの設定」ボタンをクリックし、現れた子フォームのテキストボックスに入力して、「設定」ボタンをクリックする直前の状態を示す。


図4 親フォームと子フォーム


 図5は、親フォームの「演算種別の選択」メニューをクリックし、さらに「乗算」メニューを選択したところを示す。


図5 親フォームのメニューで「乗算」を選択したところ


 図6は、親フォームのForm1.h に記述したコードを示す。一番上は、「入力データの設定」ボタンをクリックした時に子フォームを呼び出すもので、以下、演算種別の選択、「実行」ボタンをクリックしたときの動作、と続く。各イベントハンドラメソッドの内容は、前掲の表に示したとおりであり、menuExecute_Click()メソッドでは、子フォームで設定した値を呼び出すのに FormDialog::a と FormDialog::b を用いている。



図6 親フォームのForm1.h に記述したコード


 図7は、子フォームのFormDialog.h に記述したコードを示す。「設定」ボタン(名称はbutton_Set)をクリックしたときのイベントハンドラの内容は、テキストボックスの読み込みと、フォームの閉鎖である。「取消」ボタン(名称はbutton_Cancel)のイベントハンドラは、フォームの閉鎖のみである。

図7 子フォームののFormDialog.h に記述したコード


 図8および図9は、親フォームおよび子フォームで使用するグローバル変数の宣言である。


図8 Form1.h の上部に追加した変数の宣言


図9 FormDialog.h の上部に追加した変数の宣言


得られた演算結果
 図10は、子フォームでAの値を3.5、Bの値を2.8とし、親フォームで演算種別を乗算とし、「実行」ボタンをクリックした状態を示す。


図10 親フォームで、「実行」ボタンをクリックした状態