程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MFC CListCtrl 將一個列表的選中項添加到另一個列表

MFC CListCtrl 將一個列表的選中項添加到另一個列表

編輯:關於C++

MFC CListCtrl 將一個列表的選中項添加到另一個列表。本站提示廣大學習愛好者:(MFC CListCtrl 將一個列表的選中項添加到另一個列表)文章只能為提供參考,不一定能成為您想要的結果。以下是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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved