背景
本篇旨在MSDN幫助文檔下總結列表控件CListCtrl Control的使用,並列出碰到的具體問題。
正文
列表型控件List Control的類是ClistCtrl,具體成員對象詳見鏈接,以下則描述一些典型應用。
-
列表型控件的創建
當然,所有控件均有兩種實現方式,一是在對話框模版中直接將控件List Control
拖入對應的窗口上,另一種則是通過ClistCtrl
內的成員函數Creat(..)來創建。本文只記錄前者,避免過於繁瑣。當然也可以根據Creat(...)
函數的參數來創建,詳見第三部分的關於雞啄米博客
的參考鏈接。
為了能對添加的列表型控件進行操作,因此需要在對應的屬性控件添加變量——在對應的窗口的樹形控件右擊選擇添加變量
,取一個變量名,此處為m_Devinfolist
,至此則由VS自動創建了該控件的控制變量m_Devinfolist
。 -
在列表型控件上添加元素
- 獲取列表型控件的大小,調用函數GetClientRect function(..),
CRect Rect;
m_devinfoList.GetClientRect(&Rect);
* 為列表型控件定義風格,調用函數[SetExtendedStyle(..)](https://msdn.microsoft.com/en-us/library/c7ezbf7b(v=vs.110).aspx),
// 參數類型為 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
則表示有網格。
* 為列表型控件添加列,調用函數InsertColumn(..),
/*
參數 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(..)](https://msdn.microsoft.com/en-us/library/8b9s12fc(v=vs.110).aspx),
/*此函數有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(..)](https://msdn.microsoft.com/en-us/library/sya0wk5k(v=vs.110).aspx),
/*此函數的原型為
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(..)](https://msdn.microsoft.com/en-us/library/aa9fthz4(v=vs.110).aspx)來獲取鼠標單擊列表型控件的行數,
//該函數的原型為
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);
至此即可實現單擊列表型控件,獲取鼠標單擊的行數值,並獲取對應行對應列的文本。
參考鏈接:
- 雞啄米的博客VS2010/MFC編程入門之二十八(常用控件:列表視圖控件List Control 上);
- 雞啄米的博客VS2010/MFC編程入門之二十九(常用控件:列表視圖控件List Control 下);
- Msdn幫助文檔CListCtrl Class;
至此記錄完畢。
記錄時間:2017-2-22
記錄地點:深圳WZ