2015.12.15.
石立 喬

Visual Studio Community 2015の使い方(5)

―― Win32 アプリケーションで、コンボボックスを使用する ――

 複数の候補から一個のみを選択するラジオボタンは、すでに紹介した。それに似たものにリストボックスとコンボボックスがある。特に、コンボボックスは、ドロップダウンリスト形式を使用すると、普段はリストが折り畳まれているので、スペースを節約できる。
 ここでは、ドロップダウンリストを使った簡単なプログラムを作成し、参考までに、リストボックスの場合と比較する。

コンボボックス(ComboBox)のいろいろ
 コンボボックスは、入力可能なボックスと選択リストを組み合わせ(combine)たもので、その名称が付いている。CreateWindow関数で、クラス名をL"COMBOBOX"として作成する。コンボボックスには三種類あり、Combo Box Styleの
   CBS_SIMPLE --------- リストを常に表示し、選択した項目が上部の編集可能ボックスに入る
   CBS_DROPDOWN ----- 右の「▼」をクリックするとリストが現れ、選択するとリストが閉じて、上部の編集可能ボックスに入る
   CBS_DROPDOWLIST -- 上記と似ているが、上部のボックスは編集できない
で設定する。
 与えられた候補からの選択だけには、ドロップダウンリスト(CBS_DROPDOWNLIST)が適している。

コンボボックスを使った簡単なプログラム
 このプログラムは、東海道新幹線の主要駅間の運賃と特急料金を表示するもので、コンボボックスのドロップダウンリストを用い、下記の内容から成っている。すべてを、<プロジェクト名>.cppに記述する。
  1)運賃表二次元配列lpncFareと特急料金表三次元配列lpncChargeを用意する(図2)。
      運賃表の第一添字は「乗車駅」、第二添字は「降車駅」とする。
      特急料金表の添字は「列車種別」、「乗車駅」、「降車駅」の順とする。
 2)各コンボボックスを作成し、起動時に、一番上の項目が表示されるように設定しておく(図3、144行〜)。
 3)「運賃・料金」と「クリヤー」の二つの操作ボタンを作成する(図3、171行〜)。
 4)「運賃・料金」ボタンがクリックされたときの処理を記述する(図4、207行〜)。
     各コンボボックスの選択状況を読み取り、全て選択されていれば、対応する運賃nFare、特急料金nChargeを求めて、
     bInputFlagをTRUEにして、InvalidateRect関数でWM_PAINTを呼び出す。
     一部のコンボボックスが未選択の場合は、nFareを0に、nChargeを0に設定し、bInputFlagをFALSEにして、WM_PAINTを呼び出す。
 5)「クリヤー」ボタンがクリックされたときの処理を記述する(図4、226行〜)。
     各コンボボックスの設定を0番目にし、運賃nFare、特急料金nChargeを0にし、nInputFlagをFALSEにして、WM_PAINTを呼び出す。
 6)case WM_PAINTで、運賃、特急料金を表示する(図5)。
     入力済みフラグbInputFlagがTRUEであれば、運賃、特急料金を表示し、FALSEの場合は、全項目の入力を促す。
     特急料金が860の場合は、それが近距離特例であり、自由席のみであることを付け加える。
 なお、ボタン類の定義と、グローバル変数の宣言を、プログラムの最初の部分でしておく(図1)。

使用した関数の説明
◎CreateWindow関数
 コントロールなどウィンドウを作成する関数で、ここでは、特に、ドロップダウンリストとしてのコンボボックスを作成する場合について説明する。引数は、
   lpClassName -------- コントロールのクラス名で、ここでは、L"COMBOBOX"とする
   lpWindowName ------ NULLで良い
   dwStyle ------------ 一般的に用いられる、WM_CHILD | WM_VISIBLEの他に、
                   枠で囲む WM_BORDERと、Com Box StyleのCBS_DROPDOWNLISTを加える
で、戻り値は、 そのコンボボックスに対するハンドルである。
 その他の引数については、一般の場合と同じなので省略する。
◎SendMessage関数
 コントロールにメッセージを送る関数で、ここでは、特に、コンボボックスにメッセージを送る場合について説明する。
引数は、
   hWnd ------------- メッセージを送る相手のハンドルで、ここでは、hCombobox1など
   Msg -------------- メッセージ
   wParam ----------- 第一の追加メッセージ
   lParam ------------ 第二の追加メッセージ
である。
 コンボボックスで良く使用するメッセージには、下記がある。CBは、Combo Boxである。
   CB_ADDSTRING ---- リストに項目を追加する。wParamにはNULLを、lParamには(LPARAM)L"文字列"を入れる
   CB_SETCURRSEL --- 指定する項目を選択状態にする。wParamには項目番号、lParamにはNULLを入れる
   CB_GETCURRSEL --- 選択されている項目番号を戻り値として取得する。追加メッセージは、共にNULLとする。


図1 Win32Project3.cppの最初の部分で各ボタンの識別子を設定し、グローバル変数を新しく追加する



図2 運賃表と、「のぞみ」と「ひかり/こだま」の料金表を作成する




図3 CreateWindow関数で、各コンボボックスと二つの操作ボタンを作成する



図4 WndProcのWM_COMMANDの下に、ボタンをクリックした時の処理を記述する



図5 WndProcのWM_PAINTで、結果の金額を表示する


得られた結果
 図6〜図8は、このプログラムの実行結果である。起動直後と、不十分な入力のままでの「運賃・料金」クリック時には、「全項目を入力して下さい。」と表示される。


図6 「乗車駅」の「▼」をクリックして、コンボボックスのリストをプルダウンしたところ



図7 すべての欄を設定し、「運賃・料金」のボタンをクリックしたところ



図8 近距離で、「ひかり/こだま」を設定すると、自由席のみしかない


付録:リストボックスを使った場合
 選択目的のボックスでは、ドロップダウンリストが使えるコンボボックスが便利であるが、参考までにリストボックスも作成して、比較して見た。図Aは、リストボックスを生成するCreateWindow関数その他を示す。メッセージには、CB_ADDSTRINGなどの代わりに、LB_ADDSTRINGなどが用いられる(LBはList Box)。
 図Bは、作成されたリストボックスを選択した状態を示す。選択が終わっても、リスト領域が折りたたまれないので、より広いスペースを必要とする。


図A リストボックスを作成する



図B 選択が終わっても、リストはそのままになっている





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