zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/Hi-blog/p/6497626.html
Copyright © 2011-2022 走看看