List View のアイテム(番号)を直接変更する

List View のアイテム(番号)をクリックして、直接変更してみましょう。

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

プロジェクトの設定

  1. 新規プロジェクトの作成は (LvCol) に順じます。
    DialogBox 全体に ListView を貼り付けて下さい。
    スタイルの表示(View)から「レポート」を選択して、「ラベルの編集」をチェックして下さい。
    キャプションとIDを次のように設定して下さい。
    BOX キャプション ID
    DialogBox Dialog List View IDD_DIALOG1
    ListView IDC_LIST1
  2. commctrl.h をインクルードして、#pragma comment(lib,"comctl32.lib") を記述します。
    hList は List View の Handle で hEdit は List View が編集するアイテムの Handle です。
        #include    <commctrl.h>
        #pragma     comment(lib,"comctl32.lib")
    
        HWND        hList;              //List View Handle
        HWND        hEdit;              //List View Edit Handle
        char        old_num[10],new_num[10];
    
        //List View Test Data
        char    HEAD[][5]= {  "番号", "名前", "カナ"  };
        int     CX[]=      {  60, 160, 180  };
        char    t_number[][5]=
        {   "0010","0012","0020","0023","0027"   };
        char    t_name[][13]=
        {   "赤井 伸浩","荒木 真一","加藤 純","黒岩 真由子","北川 雅美子"   };
        char    t_kana[][10]=
        {   "アカイ ノブヒロ","アラキ シンイチ","カトウ ジュン","クロイワ マユコ","キタガワ マミコ"   };
        
  3. DialogBox の CALLBACK です。
    WM_INITDIALOG: で List View の Handle を hList に格納して下さい。
    InitCommonControls() で初期化して、SetInitialData() で ListView にデータを登録します。
    LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
    {   LV_DISPINFO     *lvinfo;
        NM_LISTVIEW     *pNMLV;
    
        switch (msg)
        {   case WM_INITDIALOG:
                InitCommonControls();
                hList= GetDlgItem(hDlg,IDC_LIST1);
                SetInitialData(hList,5);
                break;
        
  4. WM_NOTIFY: で List View からの通知メッセージを受け取ります。
    LOWORD(wp)==IDC_LIST1 のとき List View からの通知メッセージです。
    LVN_BEGINLABELEDIT: がアイテム編集が開始された通知です。
    hEdit を取得して、編集前のアイテム名を old_num に格納します。
    LVN_ENDLABELEDIT: がアイテム編集が終了した通知です。
    編集後のアイテム名を new_num に格納します。
    List View に表示するアイテムの値を ListView_SetItemText() で変更します。
            case WM_NOTIFY:                 //List View の通知メッセージ
                if (LOWORD(wp)==IDC_LIST1)
                {   lvinfo = (LV_DISPINFO *)lp;
                    pNMLV  = (NM_LISTVIEW *)lp;
                    switch(lvinfo->hdr.code)
                    {   case LVN_BEGINLABELEDIT:    //アイテム編集を開始
                            hEdit = ListView_GetEditControl(hList);
                            GetWindowText(hEdit,old_num, sizeof(old_num));
                            break;
                        case LVN_ENDLABELEDIT:
                            //ファイル名を変更する
                            GetWindowText(hEdit,new_num, sizeof(new_num));
    MessageBox(NULL,new_num,old_num,MB_OK);
                            ListView_SetItemText(hList,lvinfo->item.iItem,0,new_num);
                            break;
                    }
                }
                break;
        

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