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