List Box に名簿を表示する

VC++ で List Box に名簿を表示して、Edit Box から新しくタイプされた名前を追加します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトで[空のプロジェクト](DlgLst)を作成します。
    [プロジェクト][リソースの追加][Dialog][新規作成] から DialogBox を作成して、 キャプションとIDを設定して下さい。
    ID キャプション
    IDD_DIALOG1 ListBoxに名簿を表示
    IDC_EDIT1
    IDC_LIST1
    IDOK 追加
    IDCANCEL 終了
  2. DlgLst.cpp をフォルダーに格納して[プロジェクト][既存項目の追加]からプロジェクトに追加します。
    DlgLst.cpp のソースコードです。
    コメントの部分を埋めてプログラムを完成させて下さい。
    /**********************************************************/
    /*★ EditBox から入力して List Box に追加する   前田 稔 ★*/
    /**********************************************************/
    #include <windows.h>
    #include "resource.h"
    
    //リストボックス
    LPCTSTR liststr[]=
    {   "赤井  伸浩",  "荒木  真一",  "藤井  俊之",  "北村  奈緒美",
        "澤田  夕子",  "川崎  葉子",  "山下  和彦",  "黒岩  真由子"
    };
    
    char    edit_str[80];           // Edit Box から入力された名前を取得
    int     ListNo= 0;              // List Box のカーソル位置
    
    LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
    
    //★ Windows Main 関数
    int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hPrevInst,
                       LPSTR lpsCmdLine, int nCmdShow)
    {   DialogBox(hIns,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
        return TRUE;
    }
    
    //★ Dialog Box の CALLBACK 関数
    LRESULT CALLBACK DlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
    {   int i;
    
        switch (msg)
        {   case WM_INITDIALOG:
                // liststr[] に格納されている8名の名前を List Box に登録して下さい。
                // 登録は SendMessage() 関数を使って LB_INSERTSTRING を送ります。
                // カーソルを先頭のアイテムに位置付けて下さい。
                break;
            case WM_COMMAND:
                switch (LOWORD(wp))
                {   case IDOK:
                        // IDC_EDIT1 のデータを edit_str に取得します。
                        // ListNo に現在のカーソル位置を求めます。
                        // 現在の位置に edit_str を追加挿入します。
                        // 追加したアイテムにカーソル位置を設定します。
                        break;
                    case IDCANCEL:
                        EndDialog(hDlgWnd, TRUE);
                        break;
                    default:
                        return FALSE;
                }
                break;
            case WM_CLOSE:
                EndDialog(hDlgWnd, TRUE); 
                return TRUE;
        }
        return FALSE;
    }
        
  3. [デバッグ]を選択してビルドに続いて実行を行います。
    Edit Box に名前をタイプして [OK] をクリックすると List Box に追加されたら完成です。

【NOTE】

  1. List Box の ListNo が指すアイテムにカーソルを位置付けるソースコードです。
    このように List Box への指示は SendMessage() で行います。
    SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_SETCURSEL,(WPARAM)ListNo,0L);
  2. List Box にアイテムを追加するときは LB_INSERTSTRING を使います。
    第3引数が挿入位置で、第4引数に挿入する TEXT 文字列を指定します。
    "赤井 伸浩"と"荒木 真一"を登録するソースコードは次のようになります。
    SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_INSERTSTRING,(WPARAM)0,(LPARAM)"赤井 伸浩");
    SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_INSERTSTRING,(WPARAM)1,(LPARAM)"荒木 真一");
  3. 現在位置付けられているアイテム番号を調べるには LB_GETCURSEL を使います。
    第3引数、第4引数にはゼロを指定して下さい。
    関数の戻り値がアイテム番号です。
  4. List Box に登録された文字列を取り出すときは LB_GETTEXT を使います。
    第3引数がアイテム番号で、第4引数に文字列を格納する領域を指定します。
  5. List Box からアイテムを削除するときは LB_DELETESTRING を使います。
    第3引数がアイテム番号です。

プログラムの説明

  1. 最初に登録する名簿のテーブルです。
    LPCTSTR は、最後が '\0' で終わる文字列のポインタです。
        //リストボックス
        LPCTSTR liststr[]=
        {   "赤井  伸浩",  "荒木  真一",  "藤井  俊之",  "北村  奈緒美",
            "澤田  夕子",  "川崎  葉子",  "山下  和彦",  "黒岩  真由子"
        };
        
  2. WM_INITDIALOG: で List Box に最初の名簿を登録します。
    (WPARAM)i が追加挿入位置で (LPARAM)liststr[i] が登録する名前です。
    最後に先頭のアイテムにカーソルを位置付けます。
        switch (msg)
        {   case WM_INITDIALOG:
                for(i=0; i<8; i++)
                    SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_INSERTSTRING,(WPARAM)i,(LPARAM)liststr[i]);
                SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_SETCURSEL,(WPARAM)ListNo,0L);
                break;
        
  3. IDOK: でタイプ入力された名前を ListBox に追加挿入します。
    Edit Box からタイプ入力された名前を edit_str に取得します。
    カーソルが設定されているアイテム番号を調べて、その位置に追加挿入します。
        {   case IDOK:
                GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str));
                ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_GETCURSEL,0L,0L);
                SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_INSERTSTRING,(WPARAM)ListNo,(LPARAM)edit_str);
                SendMessage(GetDlgItem(hDlgWnd,IDC_LIST1),LB_SETCURSEL,(WPARAM)ListNo,0L);
                break;
        
  4. C# のプログラムは ListBox に登録する を参照して下さい。

【演習】

削除ボタンを設定して、カーソルが位置付けられているアイテムを削除して下さい。
アイテムの削除は LB_DELETESTRING です。

超初心者のプログラム入門(Win32API C++)