Visual studio C++ MFC之列表控件CListCtrl Control

背景

本篇旨在MSDN幫助文檔下總結列表控件CListCtrl Control的使用,並列出碰到的具體問題。html

正文

列表型控件List Control的類是ClistCtrl,具體成員對象詳見連接,如下則描述一些典型應用。編程

  1. 列表型控件的建立
    固然,全部控件均有兩種實現方式,一是在對話框模版中直接將控件List Control拖入對應的窗口上,另外一種則是經過ClistCtrl內的成員函數Creat(..)來建立。本文只記錄前者,避免過於繁瑣。固然也能夠根據Creat(...)函數的參數來建立,詳見第三部分的關於雞啄米博客的參考連接。
    爲了能對添加的列表型控件進行操做,所以須要在對應的屬性控件添加變量——在對應的窗口的樹形控件右擊選擇添加變量,取一個變量名,此處爲m_Devinfolist,至此則由VS自動建立了該控件的控制變量m_Devinfolistwindows

  2. 在列表型控件上添加元素ide

  • 獲取列表型控件的大小,調用函數GetClientRect function(..)函數

    CRect Rect;m_devinfoList.GetClientRect(&Rect);
  • 爲列表型控件定義風格,調用函數SetExtendedStyle(..)spa

    // 參數類型爲  DWORD dwNewStyle m_devinfoList.SetExtendedStyle(LVS_REPORT|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

    dwNewStyle定義的既是列表風格,LVS_REPORT則表明list風格爲列表型——list控件有四種風格;IconSmall IconListReport。本例程使用的是Report類型。
    LVS_EX_FULLROWSELECT表明當一列被選擇時,該列均會高亮顯示。
    LVS_EX_GRIDLINES則表示有網格。code

  • 爲列表型控件添加列,調用函數InsertColumn(..)orm

    /*
    參數 1:新建立的列索引,0爲起始值;
    參數 2:列顯示的名稱;
    參數 3:文字的對齊方式,有LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER三種選項;當列爲第0項的時候,這個參數不起做用。若要其起做用,能夠先建立,而後刪除它,再從新建立就起做用了。
    參數 4:列的寬度,這個時候上一步得到的控件大小的值就起做用了;
    參數 5:此列的子項個數,後面會調用InserItem,所以,此處爲0。
    */m_devinfoList.InsertColumn(0, _T("設備參數名稱"), LVCFMT_CENTER, Rect.Width()/5, 0);
    m_devinfoList.InsertColumn(1, _T("設備參數值"), LVCFMT_LEFT, (Rect.Width()/5)*4, 0);
  • 在樹形控件上添加子項,調用函數InsertItem(..)htm

    /*此函數有4個函數原型,此處我調用的函數原型爲
    int InsertItem(int nItem,LPCTSTR lpszItem );
    參數1:插入Item的索引,0爲起始值。這個能夠理解爲行數。
    參數2:插入的Item的名稱
    */
    m_devinfoList.InsertItem(0,_T("Node ID"));
    m_devinfoList.InsertItem(1,_T("軟件版本信息"));
    m_devinfoList.InsertItem(2,_T("硬件版本信息"));
    m_devinfoList.InsertItem(3,_T("設備類型"));
    m_devinfoList.InsertItem(4,_T(""));
    m_devinfoList.InsertItem(5,_T("設備狀態"));
    m_devinfoList.InsertItem(6,_T("主機輸入參數"));
    m_devinfoList.InsertItem(7,_T("主機輸出參數"));
    m_devinfoList.InsertItem(8,_T("主機輸入數據"));
    m_devinfoList.InsertItem(9,_T("主機輸出數據"));

    此時,即建立出來了一個2列10行的列表,以下圖所示:
    758869-20170222094708273-1014529782.png對象

  • 在第二列下面添加文字,調用函數SetItemText(..)

    /*此函數的原型爲
    BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText );
    參數1:Item的索引,能夠理解爲哪一行;
    參數2:子索引,能夠理解爲哪一列;
    參數3:要設置的文字。
    */
    m_devinfoList.SetItemText(0, 1, CstrNodeid);
    m_devinfoList.SetItemText(1, 1, _T("Version 0.0.1"));
    m_devinfoList.SetItemText(2, 1, _T("Version 0.0.1"));
    m_devinfoList.SetItemText(3, 1, _T("IO設備"));
    m_devinfoList.SetItemText(4, 1, _T(""));
    m_devinfoList.SetItemText(5, 1, _T("初始化狀態"));
    m_devinfoList.SetItemText(6, 1, _T("01 08 02 16"));
    m_devinfoList.SetItemText(7, 1, _T("03 08 04 16"));
    m_devinfoList.SetItemText(8, 1, _T("0F 13 32"));

    最終的效果以下:
    758869-20170222095810835-1167949810.png

單擊列表型控件,獲取鼠標單擊的行數值,並獲取對應行對應列的文本。
  • 首先在列表型控件上右擊添加事件處理程序,消息類型選擇NM_CLICK,類列表選擇控件所在的對話框類,生成代碼

    void CwzCANDeviceExploer001Dlg::OnNMClickdevshowList(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    *pResult = 0;// TODO: 在此添加控件通知處理程序代碼*pResult = 0;
    }
  • 在上述代碼內調用函數GetNextItem(..)來獲取鼠標單擊列表型控件的行數,

    //該函數的原型爲int GetNextItem(int nItem, int nFlags) const;/*
    函數功能:從指定的Item(行數)開始搜索符合flag標識條件的行,並返回Item的索引值(行數)
    參數1:從哪一個Item(行數)開始,-1表明找到第一個符合flag標識條件的Item。
    參數2:LVIS_SELECTED表明被選中的Item,還有LVNI_FOCUSED,獲取焦點的Item等等。
    */int selpos = m_devinfoList.GetNextItem(-1,LVIS_SELECTED);

    解析selpos便可知道用戶單擊的是列表哪一行,接着調用函數GetItemText(..)

    // 該函數有兩個函數原型,此處我調用的函數原型爲CString GetItemText(int nItem, int nSubItem) const;/* 
    參數1: 哪一個Item(哪一行);
    參數2: 哪一個SubItem(哪一列)。
    */Cstring Cstrinfo;
    Cstrinfo = m_devinfoList.GetItemText(0, 1);

    至此便可實現單擊列表型控件,獲取鼠標單擊的行數值,並獲取對應行對應列的文本。

參考連接:

至此記錄完畢。

記錄時間:2017-2-22記錄地點:深圳WZ

相關文章
相關標籤/搜索