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 親フォームで、「実行」ボタンをクリックした状態