MFC例項:[4] List Control 控制元件例項
轉自:https://blog.csdn.net/sunjikui1255326447/article/details/88916090 作者:司徒荊
MFC例項:[4] List Control 控制元件例項
目錄
1、List_control初始化程式碼如下:
2、左鍵單擊選中事件
3、右鍵單擊彈出選單
4、選單下刪除事件響應
1、開啟vs2017----》檔案------》新建-------》專案,選擇MFC 應用-------》基於對話方塊----》完成。
2、Ctrl+shift+E開啟資源檢視,雙擊IDD_MFC_LIST_DIALOG,開啟設計介面。
3、刪除所有控制元件按鈕,開啟工具箱(可以從檢視中找),新增一個List Control控制元件,ID設定為IDC_PROGRAM_LANG_LIST,View屬性設為Report,即為報表風格,Single Selection屬性設為True。再新增一個靜態文字控制元件和一個編輯框,靜態文字控制元件的Caption屬性設為“選擇的語言:”,編輯框的ID設為IDC_LANG_SEL_EDIT,Read Only屬性設為True。此時的對話方塊模板如下圖:
4、為列表檢視控制元件IDC_PROGRAM_LANG_LIST新增變數為m_List。
步驟:選中List_Control 控制元件面板,右鍵單擊----》新增變數------》名稱m_List。點選完成
5、新增初始化程式碼:
List_control初始化程式碼如下:
// TODO: 在此新增額外的初始化程式碼 CRect rect; // 獲取程式語言列表檢視控制元件的位置和大小 m_List.GetClientRect(&rect); // 為列表檢視控制元件新增全行選中和柵格風格 m_List.SetExtendedStyle(m_List.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);// 為列表檢視控制元件新增三列 m_List.InsertColumn(0, _T("語言"), LVCFMT_CENTER, rect.Width() / 3, 0); m_List.InsertColumn(1, _T("2019.02排名"), LVCFMT_CENTER, rect.Width() / 3, 1); m_List.InsertColumn(2, _T("2018.02排名"), LVCFMT_CENTER, rect.Width() / 3, 2); // 在列表檢視控制元件中插入列表項,並設定列表子項文字 m_List.InsertItem(0, _T("Java")); m_List.SetItemText(0, 1, _T("1")); m_List.SetItemText(0, 2, _T("1")); m_List.InsertItem(1, _T("C")); m_List.SetItemText(1, 1, _T("2")); m_List.SetItemText(1, 2, _T("2")); m_List.InsertItem(2, _T("C#")); m_List.SetItemText(2, 1, _T("3")); m_List.SetItemText(2, 2, _T("6")); m_List.InsertItem(3, _T("C++")); m_List.SetItemText(3, 1, _T("4")); m_List.SetItemText(3, 2, _T("3"));
6、編譯執行---》結果如下:
7、接著將我們的選中的語言顯示在下面的編譯框中間。選中List_Control 控制元件面板,右鍵單擊----》新增事件處理程式------》添家編輯。如下圖。完成後,跳轉到MFC_LISTDlg.cpp檔案。
8、程式自動新增程式碼如下:
9、在這個函式的新增程式碼(該函式意思是當滑鼠單擊的訊息處理)
左鍵單擊選中事件
void CMFCLISTDlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此新增控制元件通知處理程式程式碼 *pResult = 0; CString strLangName; // 選擇語言的名稱字串 NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR; if (-1 != pNMListView->iItem) // 如果iItem不是-1,就說明有列表項被選擇 { // 獲取被選擇列表項第一個子項的文字 strLangName = m_List.GetItemText(pNMListView->iItem, 0); // 將選擇的語言顯示與編輯框中 SetDlgItemText(IDC_LANG_SEL_EDIT, strLangName); } *pResult = 0; } //可以實現多行選中,左鍵雙擊 void COffLineDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此新增控制元件通知處理程式程式碼 POSITION ps; int nIndex; ps = m_listIP.GetFirstSelectedItemPosition(); nIndex = m_listIP.GetNextSelectedItem(ps); //TODO:新增多選的操作。 if (nIndex == -1) { //m_list.SetItemState(-1,LVNI_SELECTED,LVNI_SELECTED); MessageBox(_T("無效的客戶端ID,請重新選擇")); return; } m_listIP.SetItemState(nIndex, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); CString str; str = m_listIP.GetItemText(nIndex, 0); MessageBox(str); str=str+m_list.GetItemText(nIndex,1); //所有的 *pResult = 0; }
10、執行程式後,如下圖,單擊每一行,會顯示該行資料:
11、但是呢,選中後,右鍵單擊如何顯示選單呢?往下-----》選中List_Control 控制元件面板,右鍵單擊----》新增事件處理程式------》添家編輯。如下圖。完成後,跳轉到MFC_LISTDlg.cpp檔案
12、新增按鈕---》,步驟如下:
13、按鈕設計如下:
14、編寫右鍵單擊事件函式:(選單響應)
右鍵單擊彈出選單
void CMFCLISTDlg::OnNMRClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此新增控制元件通知處理程式程式碼 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if (pNMListView->iItem != -1) { CPoint pt; GetCursorPos(&pt); CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu *popmenu; popmenu = menu.GetSubMenu(0); popmenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); } *pResult = 0; }
15、執行效果如下:
16、至於新增,刪除等事件響應函式,請大家自行編寫。
程式碼如下:
選單下刪除事件響應
// 刪除程式碼 void CMFCLISTDlg::OnFile32772() { // TODO: 在此新增命令處理程式程式碼 int i, iState; int nItemSelected = m_List.GetSelectedCount(); int nItemCount = m_List.GetItemCount(); if (nItemSelected < 1) return; for (i = nItemCount - 1; i >= 0; i--) { iState = m_List.GetItemState(i, LVIS_SELECTED); if (iState != 0) { m_List.DeleteItem(i); } } }
17、專案地址:
連結:https://pan.baidu.com/s/1Ja47MNGDF8bKfWOqYGJvQw
提取碼:0odm
補充:
1、在最後一行插入,並將焦點放置最後:
int CountNum =m_list.GetItemCount(); if (CountNum > 0) m_list.EnsureVisible(CountNum - 1, FALSE); m_list.InsertItem(CountNum, (pInfo->clientid)); m_list.SetItemText(CountNum, 1,(m_Clientlist.GetItemText(i, 2).GetBuffer(0))); m_list.SetItemText(CountNum, 2, _T("上線")); m_list.SetItemText(CountNum , 3,(strTime.GetBuffer(0)));