本篇旨在MSDN幫助文檔下總結列表控件CListCtrl Control的使用,並列出碰到的具體問題。html
列表型控件List Control的類是ClistCtrl,具體成員對象詳見連接,如下則描述一些典型應用。編程
列表型控件的建立
固然,全部控件均有兩種實現方式,一是在對話框模版中直接將控件List Control
拖入對應的窗口上,另外一種則是經過ClistCtrl
內的成員函數Creat(..)來建立。本文只記錄前者,避免過於繁瑣。固然也能夠根據Creat(...)
函數的參數來建立,詳見第三部分的關於雞啄米博客
的參考連接。
爲了能對添加的列表型控件進行操做,所以須要在對應的屬性控件添加變量——在對應的窗口的樹形控件右擊選擇添加變量
,取一個變量名,此處爲m_Devinfolist
,至此則由VS自動建立了該控件的控制變量m_Devinfolist
。windows
在列表型控件上添加元素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控件有四種風格;Icon
/ Small Icon
/ List
/ Report
。本例程使用的是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行的列表,以下圖所示:
對象
在第二列下面添加文字,調用函數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"));
最終的效果以下:
首先在列表型控件上右擊添加事件處理程序,消息類型選擇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);
至此便可實現單擊列表型控件,獲取鼠標單擊的行數值,並獲取對應行對應列的文本。
Msdn幫助文檔CListCtrl Class;
至此記錄完畢。
記錄時間:2017-2-22記錄地點:深圳WZ