次の方法で共有


単純なリスト ボックスを作成する方法

このトピックでは、単純なリスト ボックスで項目を初期化および取得する方法について説明します。

このトピックの C++ コード例には、スポーツ チームの選手に関する情報をリスト ボックスに入力するダイアログ ボックス プロシージャが含まれています。 ユーザーがリストから選手の名前を選択すると、その選手に関する情報がダイアログ ボックスに表示されます。 このリスト ボックスのウィンドウスタイルには LBS_SORT が含まれており、その結果、並べ替えられた項目リストが表示されます。 次のスクリーン ショットは、このダイアログ ボックスを示しています。

screen shot of a dialog box containing a labeled list box, text about the selected list box item, and an ok button

知っておくべきこと

テクノロジ

前提条件

  • C/C++
  • Windows ユーザー インターフェイス プログラミング

手順

アプリケーションでは、以下のリスト ボックス関連のタスクを実行する必要があります。

  • リスト ボックスを初期化する
  • リスト ボックスからユーザーの選択内容を取得する

次の C++ コード例では、選手に関する情報が構造体の配列に格納されます。 このダイアログ ボックス プロシージャは、初期化中に LB_ADDSTRING メッセージを使用して、チーム メンバーの名前を一度に 1 人ずつリスト ボックス (IDC_LISTBOX_EXAMPLE) に追加します。 また、LB_SETITEMDATA メッセージを使用して、選手の配列インデックスを項目データとしてリスト ボックスに追加します。 後でユーザーがリスト ボックスから選手を選択したときに、ダイアログ ボックス プロシージャは LB_GETITEMDATA メッセージを使用して、対応する配列インデックスを取得します。 その後、配列インデックスを使用して、配列から選手情報を取得します。

typedef struct 
{ 
    TCHAR achName[MAX_PATH]; 
    TCHAR achPosition[12]; 
    int nGamesPlayed; 
    int nGoalsScored; 
} Player; 

Player Roster[] = 
{ 
    {TEXT("Haas, Jonathan"), TEXT("Midfield"), 18, 4 }, 
    {TEXT("Pai, Jyothi"), TEXT("Forward"), 36, 12 }, 
    {TEXT("Hanif, Kerim"), TEXT("Back"), 26, 0 }, 
    {TEXT("Anderberg, Michael"), TEXT("Back"), 24, 2 }, 
    {TEXT("Jelitto, Jacek"), TEXT("Midfield"), 26, 3 }, 
    {TEXT("Raposo, Rui"), TEXT("Back"), 24, 3}, 
    {TEXT("Joseph, Brad"), TEXT("Forward"), 13, 3 }, 
    {TEXT("Bouchard, Thomas"), TEXT("Forward"), 28, 5 }, 
    {TEXT("Salmre, Ivo "), TEXT("Midfield"), 27, 7 }, 
    {TEXT("Camp, David"), TEXT("Midfield"), 22, 3 }, 
    {TEXT("Kohl, Franz"), TEXT("Goalkeeper"), 17, 0 }, 
}; 


INT_PTR CALLBACK ListBoxExampleProc(HWND hDlg, UINT message, 
        WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        {
            // Add items to list. 
            HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);  
            for (int i = 0; i < ARRAYSIZE(Roster); i++) 
            { 
                int pos = (int)SendMessage(hwndList, LB_ADDSTRING, 0, 
                    (LPARAM) Roster[i].achName); 
                // Set the array index of the player as item data.
                // This enables us to retrieve the item from the array
                // even after the items are sorted by the list box.
                SendMessage(hwndList, LB_SETITEMDATA, pos, (LPARAM) i); 
            } 
            // Set input focus to the list box.
            SetFocus(hwndList); 
            return TRUE;               
        } 

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;

        case IDC_LISTBOX_EXAMPLE:
            {
                switch (HIWORD(wParam)) 
                { 
                case LBN_SELCHANGE:
                    {
                        HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE); 

                        // Get selected index.
                        int lbItem = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0); 

                        // Get item data.
                        int i = (int)SendMessage(hwndList, LB_GETITEMDATA, lbItem, 0);

                        // Do something with the data from Roster[i]
                        TCHAR buff[MAX_PATH];
                        StringCbPrintf (buff, ARRAYSIZE(buff),  
                            TEXT("Position: %s\nGames played: %d\nGoals: %d"), 
                            Roster[i].achPosition, Roster[i].nGamesPlayed, 
                            Roster[i].nGoalsScored);

                        SetDlgItemText(hDlg, IDC_STATISTICS, buff); 
                        return TRUE; 
                    } 
                }
            }
            return TRUE;
        }
    }
    return FALSE;
}

リスト ボックス コントロール リファレンス

リスト ボックスについて

リスト ボックスの使用