• MFC CListCtrl 将一个列表的选中项添加到另一个列表


    MFC CListCtrl 将一个列表的选中项添加到另一个列表, 用VC6.0实现:

    简单记录一下自己的学习历程, 和大家分享,如果对你有用,我很高兴。

    1、新建一个基于对话框的工程(Dialog-Based)

    1.1 新建项目

    打开VC6.0 -> File -> New -> Projects -> MFC AppWizard[exe] -> 工程名CListCtrlEg -> 点击OK

      ->Dialog based -> Finish -> OK

            

    1.2 添加控件CListCtrl

    选择资源视图(ResourceView) -> Dialog -> 双击选中我们自己创建好的Dialog, 添加如下内容

    两个列表控件(ListControl):

      ID: IDC_LIST_LEFT     Styles->View->设置为Report

      ID: IDC_LIST_RIGHT  Styles->View->设置为Report

    将CListCtrl控件关联两个成员变量:

    选中控件,右键点击ClassWizard -> Member Variables选项卡 -> Add Variable -> 填写变量名 ->【最后点击Ok】

    这样在类中就会自动产生两个CListCtrl的对象与控件相关联,并且在DoDataExchange()函数中会增加两行代码,表示控件与成员相关联。

    另外我们需要增加一个整形的计数器m_indexLeft, 作为左边的CListCtrl 项的下标,初始化为-1:

    添加代码进行测试:在BOOL CCListCtrlEgDlg::OnInitDialog()中   //TODO后面添加代码 

     1 // TODO: Add extra initialization here
     2     // 设置左边控件
     3     m_listCtrlLeft.SetTextColor(RGB(0,0,255));
     4     m_listCtrlLeft.SetExtendedStyle(m_listCtrlLeft.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
     5     m_listCtrlLeft.InsertColumn(0, _T("Day"),LVCFMT_CENTER,55);
     6     m_listCtrlLeft.InsertColumn(1, _T("Name"),LVCFMT_CENTER,100);
     7 
     8     // 设置右边控件 - 后面添加的
     9     m_listCtrlRight.SetTextColor(RGB(0,0,255));
    10     m_listCtrlRight.SetExtendedStyle(m_listCtrlRight.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
    11     m_listCtrlRight.InsertColumn(0, _T("Day"),LVCFMT_CENTER,55);
    12     m_listCtrlRight.InsertColumn(1, _T("Name"),LVCFMT_CENTER,100);
    13 
    14     // 向左边的ListCtrl添加数据
    15     m_indexLeft++;
    16     
    17     m_listCtrlLeft.InsertItem(m_indexLeft,"Day1");
    18     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Monday");
    19     
    20     m_listCtrlLeft.InsertItem(m_indexLeft,"Day2");
    21     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Tuesday");
    22     
    23     m_listCtrlLeft.InsertItem(m_indexLeft,"Day3");
    24     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Wednesday");
    25     
    26     m_listCtrlLeft.InsertItem(m_indexLeft,"Day4");
    27     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Thursday");
    28     
    29     m_listCtrlLeft.InsertItem(m_indexLeft,"Day5");
    30     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Friday");
    31     
    32     m_listCtrlLeft.InsertItem(m_indexLeft,"Day6");
    33     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Saturday");
    34     
    35     m_listCtrlLeft.InsertItem(m_indexLeft,"Day7");
    36     m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Sunday");
    37     
    38     SetWindowLong(m_listCtrlLeft.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
    39     m_listCtrlLeft.SetExtendedStyle(LVS_EX_GRIDLINES);                     //设置左边控件扩展风格为网格
    40     ::SendMessage(m_listCtrlLeft.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
    41         LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
    42 
    43     SetWindowLong(m_listCtrlRight.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
    44     m_listCtrlRight.SetExtendedStyle(LVS_EX_GRIDLINES);                     //设置右边控件扩展风格为网格 - 后面添加的
    45     ::SendMessage(m_listCtrlRight.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
    46         LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

    效果如下:

    1.3 添加按钮和文本框

    a)两个静态文本框(Static Text):

      ID: IDC_STATIC  Caption: Days in a week

      ID: IDC_STATIC  Caption: Choose days to have a rest

    b)四个按钮Button

      ID: IDC_BTN_ADD  Caption:>      // 添加选中项

      ID: IDC_BTN_ADDALL  Caption:>>   // 全部添加

      ID: IDC_BTN_DEL  Caption:<       // 删除选中项

      ID: IDC_BTN_DELALL  Caption:>>       // 删除全部

    运行效果如下图所示:

     

    2、实现功能

    我们可以分别双击控件,添加相应的响应函数

    2.1 添加选中项CCListCtrlEgDlg::OnBtnAdd() 

     1 void CCListCtrlEgDlg::OnBtnAdd() 
     2 {
     3     // TODO: Add your control notification handler code here
     4     TCHAR szBuf[100];
     5     /*    memset(szBuf, 0, sizeof(szBuf));*/
     6     // LVITEM 数据结构, 用来获取CListCtrl的列表项的值
     7     LVITEM lvi;
     8     lvi.pszText = szBuf;            //存放item的文本内容
     9     lvi.iItem = -1;                    //索引下标
    10     lvi.iSubItem = 0;
    11     lvi.mask = LVIF_TEXT;
    12     lvi.cchTextMax = 1024;
    13     
    14     CString str;
    15     for(int i = 0; i < m_listCtrlLeft.GetItemCount(); i++) 
    16     {
    17         if (LVIS_SELECTED == m_listCtrlLeft.GetItemState(i, LVIS_SELECTED))
    18         {
    19             lvi.iItem = i;
    20             m_listCtrlLeft.GetItem(&lvi);
    21             
    22             TCHAR szBuf2[100];
    23             // 增加一个查重的功能, 同样需要一个LVITEM的结构用来从右边的m_listCtrlRight取值进行比较
    24             LVITEM lvi2;
    25             lvi2.pszText = szBuf2;                //存放item的文本内容
    26             lvi2.iItem = -1;                    //索引下标
    27             lvi2.iSubItem = 0;
    28             lvi2.mask = LVIF_TEXT;
    29             lvi2.cchTextMax = 1024;
    30             
    31             for(int j = 0; j < m_listCtrlRight.GetItemCount(); j++) 
    32             {
    33                 lvi2.iItem = j;            //一条条表项进行比较
    34                 m_listCtrlRight.GetItem(&lvi2);
    35                 
    36                 if(!strcmp(lvi.pszText, lvi2.pszText))        //如果左边选中的表项跟右边有重复,则不添加到右边了
    37                 {
    38                     m_flag = FALSE;
    39                     break;
    40                 }
    41             }
    42             if(m_flag) 
    43             {
    44                 m_indexRight++;
    45                 m_listCtrlRight.InsertItem(m_indexRight, szBuf);
    46                 m_listCtrlRight.SetItemText(m_indexRight, 1, m_listCtrlLeft.GetItemText(i, 1));
    47             }
    48             m_flag = TRUE;
    49         }
    50     }
    51 }

    这里我们需要添加两个成员变量:

    int m_indexRight = -1;        // 右边CListCtrl控件的下标

    BOOL m_flag = TRUE;         // 判断右边控件中是否已经存在选中的项

    另外还需要在CCListCtrlSampleDlg::OnInitDialog()中对右边控件进行一些设置, 在前面粗体显示的代码中已经设置好了。 

    运行结果展示如下:

    2.2 添加全部CCListCtrlEgDlg::OnBtnAddall()

     1 void CCListCtrlEgDlg::OnBtnAddall() 
     2 {
     3     // TODO: Add your control notification handler code here
     4     //有两种方式实现
     5     //     m_listCtrlRight.DeleteAllItems();    //删除全部项
     6     //     m_indexRight = -1;                    // 重置下标
     7     
     8     OnBtnDelall();                        // 调用后面的函数删除全部项
     9     
    10     TCHAR szBuf[100];
    11     LVITEM lvi;
    12     lvi.pszText = szBuf;            //存放item的文本内容
    13     lvi.iItem = -1;                    //索引下标
    14     lvi.iSubItem = 0;
    15     lvi.mask = LVIF_TEXT;
    16     lvi.cchTextMax = 1024;
    17     
    18     CString str;
    19     for(int i = 0; i < m_listCtrlLeft.GetItemCount(); i++) 
    20     {
    21         lvi.iItem = i;
    22         m_listCtrlLeft.GetItem(&lvi);
    23         
    24         m_indexRight++;
    25         m_listCtrlRight.InsertItem(m_indexRight, szBuf);
    26         m_listCtrlRight.SetItemText(m_indexRight, 1, m_listCtrlLeft.GetItemText(i, 1));
    27     }
    28 }

    2.3 删除选中项CCListCtrlEgDlg::OnBtnDel() 

     1 void CCListCtrlEgDlg::OnBtnDel() 
     2 {
     3     // 逆序判断,主要是因为在删除的时候表项的数量是会变动的
     4     for(int i = m_listCtrlRight.GetItemCount(); i > -1; i--) 
     5     {
     6         if (LVIS_SELECTED == m_listCtrlRight.GetItemState(i, LVIS_SELECTED))
     7         {
     8             m_listCtrlRight.DeleteItem(i);
     9             m_indexRight--;
    10         }
    11     }    
    12 }

    2.4 删除全部CCListCtrlEgDlg::OnBtnDelall() 

    1 void CCListCtrlEgDlg::OnBtnDelall() 
    2 {
    3     m_listCtrlRight.DeleteAllItems();        // 删除全部项
    4     m_indexRight = -1;                        // 重置下标
    5 }

    运行效果如下:

    3、源码: 

    百度云分享:链接: https://pan.baidu.com/s/1bYN3WE 密码: r7ky

  • 相关阅读:
    vue的选项
    css(3)基础知识查漏补缺
    总结获取网页相关的一些宽高
    vue的全局api(二)
    vue的全局api
    vue的内部指令
    Java File
    Java File IO学习笔记
    systemctl介绍
    java学习笔记一(20180319)
  • 原文地址:https://www.cnblogs.com/Hi-blog/p/6497626.html
Copyright © 2020-2023  润新知