1. 程式人生 > 實用技巧 >MFC例項:[4] List Control 控制元件例項

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)));