ダイアログボックスにコンボボックスを付ける

コンボボックス

今回は、ダイアログボックスにコンボボックスを付けます。

ボタンを押せば、現在のコンボボックスの状態が、表示されるようにします。

テキストの表示 - インコのWindowsSDK で作成したソースを修正します。

ここでは、Reseditで作成する方法も説明します。

流れ

1.コンボボックスで使用するデータのテーブルを作成。

WM_INITDIALOG

リストボックス - インコのWindowsSDK でも説明しましたが、WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。

1.CB_ADDSTRINGメッセージで、コンボボックスにデータを入れます

lResult = SendMessage(
    (HWND) hWndControl,  // コンボボックスのハンドル
    (UINT) CB_ADDSTRING,
    0                    // 0固定
    (LPARAM) lpszString, // 追加する項目の文字列
);

2.CB_FINDSTRINGEXACTメッセージで、コンボボックスから、指定文字列にマッチする項目を選択
戻り値は、マッチした項目のインデックス番号が入ります。

lResult = SendMessage(
    (HWND) hWndControl, // コンボボックスのハンドル
    (UINT) CB_FINDSTRINGEXACT,
    (WPARAM) indexStart, // 検索開始インデックス
                         //  -1の場合は先頭から検索
    (LPARAM) lpszString, // 検索文字列
);

3.CB_SETCURSELメッセージで、コンボボックスの表示する項目を選択

lResult = SendMessage(
    (HWND) hWndControl, // コンボボックスのハンドル
    (UINT) CB_SETCURSEL,
    (WPARAM) index,     // データを表示するインデックス
                        //  -1の場合は何も選択していない状態にする
    0                   // 0固定
);

WM_COMMAND

1.CB_GETCURSELメッセージで、現在選択されているコンボボックスのインデックスを取得します。
戻り値は、現在選択されているコンボボックスのインデックス番号が入ります。

lResult = SendMessage(
    (HWND) hWndControl,  // コンボボックスのハンドル
    (UINT) CB_GETCURSEL,
    0                    // 0固定
    0                    // 0固定
);

2.SetDlgItemText()で取得したデータを表示

BOOL SetDlgItemText(
  HWND hDlg,         // ダイアログボックスのハンドル
  int nIDDlgItem,    // コントロールID
  LPCTSTR lpString   // 表示するテキスト
);

リソースファイル

1.ダイアログボックスにコンボボックス[GROUPBOX]を追加

GROUPBOX          "text", id,  x0, y0, width, height, style

text表示するテキスト
idコントロールID
x0コンボボックス左上のx座標
y0コンボボックス左上のy座標
widthコンボボックスの幅
heightコンボボックスの高さ
※リストを開いたときの高さ
style スタイル
ウインドウスタイルと、コンボボックスのスタイルを指定可能

VCwin32アプリケーション2

コンボボックスの高さは、リストを開いたときの高さになるので、修正します。初期状態のままでは、 高さが足りないので、リストが開けなくなります。
ビジュアルスタイルでコンパイルした場合は、 WindowsXPでは、リストが開きますが、Windows2000では開きません。)

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include "resource.h"

// グローバル変数:
LPCTSTR szBuf_edit1;
LPCTSTR strItem[] = {
  TEXT("COM1") ,
  TEXT("COM2") ,
  TEXT("COM3")
};

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT wmId;
    HWND hCombo;
    UINT com_no;
    UINT i;
    WPARAM index;
    hCombo = GetDlgItem(hWnd, IDC_COMBO1);
    switch (msg) {
        case WM_INITDIALOG:
            // コンボボックスにデータを詰めていく
            for (i = 0 ; i < 3 ; i++)
            {
                SendMessage(hCombo , CB_ADDSTRING , 0 , (LPARAM)strItem[i]);
            }
            // ウインドウ生成時にはじめに表示するデータを指定
            index = SendMessage(hCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)TEXT("COM1"));
            SendMessage(hCombo, CB_SETCURSEL, index, 0);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        case WM_COMMAND:
            wmId = LOWORD(wParam);
            switch (wmId)
            {
                case IDC_BUTTON1: // ボタンが押されたとき
                    // 現在のコンボボックスのデータを取得
                    com_no = (UINT)SendMessage(hCombo, CB_GETCURSEL, 0, 0);
                    // テキストの表示
                    szBuf_edit1 = strItem[com_no];
                    SetDlgItemText(hWnd, IDC_STATIC1, szBuf_edit1); 
                    break;
            }
            break;
        return TRUE;
    }
    return FALSE;
}

resource.h

#define IDC_BUTTON1 1002
#define IDC_STATIC1 1003
#define IDC_COMBO1 1011
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。

test.rc
#include <windows.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
BEGIN
    PUSHBUTTON      "表示", IDC_BUTTON1, 108, 15, 36, 16, WS_GROUP
    COMBOBOX        IDC_COMBO1, 15, 17, 74, 74, CBS_DROPDOWNLIST | CBS_HASSTRINGS
    LTEXT           "", IDC_STATIC1, 15, 49, 152, 14
END

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。