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