2015.12.25.
石立 喬

Visual Studio Community 2015の使い方(6)

―― エディット、コンボボックス、スタティックの各コントロールとボタンを使用する ――

 キーボードから数値を入力して計算をさせたいことがある。エディットコントロールは、入出力が可能で、編集もできる便利なコントロールである。一方、スタティックコントロールは、計算結果を表示する出力専用として使用できる。
 ここでは、これらのコントロールを使用し、すでに紹介したコンボボックスのプルダウンリストとボタンと合わせて、四則演算を行うプログラムを紹介する。

エディットコントロール(Edit Control)
 エディットコントロールは、ユーザーが文字列を入力し、編集することができるボックスである。入力できる場所にカーソルが現れるので、キーボードから入力する。CreateWindow関数で、システムクラス名をL"EDIT"として作成する。
 良く使用するEdit Styleには、
   ES_MULTILINE ------ 複数行の入力が可能(デフォルトは1行のみ)
   ES_RIGHT ---------- 右詰めにする(デフォルトは左詰め)
   ES_NUMBER -------- 入力を数字のみに限定する
などがあり、WS_BORDERで、枠を描くのが一般的である。

スタティックコントロール(Static Control)
 文字通り、静的に画像や文字列を表示できるコントロールで、キーボードからの入力や編集はできない。エディットコントロールのように、白地の特定の枠内に出力表示しないので、親ウィンドウの背景色に溶け込む形で表示ができる。CreateWindow関数で、システムクラス名をL"STATIC"として作成する。
 良く使用するStatic Styleは、
   SS_RIGHT --------- 右詰めにする(デフォルトは左詰め)
   SS_CENTER -------- センタリングする
などである。

エディットコントロールを使った四則演算プログラム
 このプログラムは、二つのエディットコントロールにキーボードから数値を入力し、それらの間で四則演算を行うものである。整数同士として演算するか、実数同士として演算するかは、ボタンで選択する。
  エディットコントロールに入力をしないと、数値0と見なされる。特に除算の場合、除数を0とすると、実数演算では結果が「inf」(無限大)と表示されるだけであるが、整数演算では実行時エラーを起こすことが分かった。そこで、メッセージボックスを作成して、注意を促すことにした。
 親ウィンドウの背景色は、「使い方(4)」以降と同じ方法で設定した。
 プログラムは、下記から成っていて、すべてを、<プロジェクト名>.cppに記述する。
 1)親ウィンドウ上に、左から、エディット、コンボボックス、エディット、スタティックの順にコントロールを配置する(図2)。
    各コントロールには、CreateWindow関数の戻り値でハンドルを設定しておく(メッセージ受け取りのため)。
 2)同様に、下方に、三個のボタンを配置する(図2)。
    各ボタンは、それぞれ、識別子と関連付けておく(処理内容記述のため)。
 3)3個のボタンの識別子と、4個のコントロールのハンドル名を宣言しておく(図1)。
 4)ボタンのクリックによって呼び出されるWinProcの最初の部分で、内部使用する変数類を宣言する(図3)。
 5)「整数演算」ボタンがクリックされたときの処理を、case IDC_BUTTON1に記述する(図4)。
   ・hEdit1のエディットコントロールから文字列をszBufferに読み取り、整数型の数値に変換する
   ・hEdit2についても同様にする
   ・hCombo1のコンボボックスの選択番号nItemNumberを取得する
   ・nItemNumberに応じて加減乗除の演算を行う
   ・除算については、除数が0の場合は「ゼロ割り注意」のメッセージボックスを表示し、bErrorFlagをTRUEにする
   ・bErrorFlagがTRUEなら、スタティックに空白を書き込み(前の結果が残っていれば消す)、FALSEなら演算結果を書き込む
 6)「実数演算」ボタンがクリックされたときの処理を、case IDC_BUTTON2に記述する(図5)。
    実数型の数値への変換と、演算結果の出力フォーマット以外は、5)と同じである。
 7)「クリヤー」ボタンがクリックされた時の処理を、case IDC_BUTTON3に記述する(図6)。
   ・hEdit1とhEdit2の2つのエディットコントロールにNULLを設定する
   ・hCombo1のコンボボックスの選択番号nItemNumberを0に設定する
   ・hStatic1のスタティックに「=」と空白を書き込み、FALSEなら「=」と演算結果を書き込む

使用した関数の説明
 以下に説明する関数の引数として使用されるlpStringは、LPCTSTR型やLPTSTR型と指定されている。公開資料では、(LPCTSTR)や(LPTSTR)でキャストしているものがあるが、WCHAR型配列のszBufferを、キャストなしで、そのまま使用できる。
◎SetWindowText関数
 ウィンドウのタイトルや、コントロールの文字列を設定するのに使用する。引数は、
   hWnd ----------- 文字列を書き込みたいウィンドウまたはコントロールへのハンドル
   lpString --------- 設定したい文字列、LPCTSTR型
である。
 似たものにSetDlgItemText関数があるが、こちらの引数は、
   hDlg ----------- 文字列を書き込みたいコントロールが属するダイアログボックスへのハンドル
   nIDDlgItem ------ コントロールの識別子
   lpString --------- 設定したい文字列、LPCTSTR型
であり、親ウィンドウのハンドルとコントロールの識別子の双方が必要になる。
◎GetWindowText関数
 ウィンドウのタイトルや、コントロールの文字列を取得するのに使用する。引数は、
   hWnd ---------- 文字列を取得したいウィンドウまたはコントロールへのハンドル
   lpString -------- 文字列を受け取るためのバッファ、LPTSTR型
   nMaxCount ----- 受け取る最大文字数(最後のnull文字含む)
である。
 似たものにGetDlgItemText関数があるが、こちらの引数は、
   hDlg ---------- 文字列を取得したいたいコントロールが属するダイアログボックスへのハンドル
   nIDDlgItem ----- コントロールの識別子
   lpString -------- 文字列を受け取るためのバッファ、LPTSTR型
   nMaxCount ----- 受け取る最大文字数(最後のnull文字含む)
であり、SetDlgItemText関数の場合と同様に、親ウィンドウのハンドルとコントロールの識別子の双方が必要になる。
◎MessageBox関数
 メッセージボックスを作成するのに使用する。引数は、
   hWnd ---------- 親ウィンドウへのハンドル
   lpText --------- ダイアログボックス内に表示する本文
   lpCaption ------- タイトル
   uType --------- アイコンの種類やボタンの種類を指定する(下記参照)
である。
 主なアイコンの種類は、
   MB_ICONINFORMATION ----- 情報提供に用いる、円形の青地に白抜きの「i」
   MB_ICONQUESTION -------- 問い合わせに用いる、円形の青地に白抜きの「?」
   MB_ICONWARNING --------- 警告に用いる、三角形の黄地に黒の「!」
   MB_ICONERROR ----------- エラー告知に用いる、円形の赤地に白抜きの「X」
であり、ボタンの種類は、
   MB_OK ------------------- 確認・了解に用いる、「OK」のみ
   MB_OKCANCEL ------------ 確認・了解または保留・中止に用いる、「OK」、「キャンセル」の二種類
   MB_YESNO --------------- 判断・回答に用いる、「はい」、「いいえ」の二種類
   MB_YESNOCANCEL --------- 判断・回答または保留・中止に用いる、「はい」、「いいえ」、「キャンセル」の三種類
である。


図1 最初の部分で各ボタンの識別子を設定し、コントロールのハンドルを宣言する



図2 各種コントロールを作成し、ハンドルや識別子と関連づける



図3 WinProcの頭で、この関数内のみで使用する変数を宣言する



図4 「整数演算」ボタンに対しては、整数として読み込み演算する



図5 「実数演算」ボタンに対しては、実数として読み込み演算する



図6 「クリヤー」ボタンに対しては、各エディットコントロールにNULLを入れる


得られた結果
 図7〜図9は、このプログラムの実行結果である。起動直後と、エディットコントロールに入力しないと、内容が0として処理される。


図7 整数を入力して、「整数演算」のボタンをクリックしたところ



図8 実数を入力し、「実数演算」のボタンをクリックしたところ



図9 ゼロで割ると現れるメッセージボックス






「Visual C++の勉強部屋」(目次)