首先看一下列表视图的四种类型,类型之间的转换可以在属性中的VIEW
Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。
Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。
List列表风格:与小图标风格类似,图标和文字的对齐方式不同。
Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。
MFC为列表视图控件的操作提供了CListCtrl类。CListCtrl类中主要的成员函数有:
UINT GetSelectedCount( ) const;
该函数返回列表视图控件中被选择列表项的数量。
POSITION GetFirstSelectedItemPosition( ) const;
获取列表视图控件中第一个被选择项的位置。返回的POSITION值可以用来迭代来获取其他选择项,可以当作参数传入下面的GetNextSelectedItem函数来获得选择项的索引。如果没有被选择项则返回NULL。
int GetNextSelectedItem(POSITION& pos) const;
该函数获取由pos指定的列表项的索引,然后将pos设置为下一个位置的POSITION值。参数pos为之前调用GetNextSelectedItem或GetFirstSelectedItemPosition得到的POSITION值的引用。返回值就是pos指定列表项的索引。
int GetItemCount( ) const;
获取列表视图控件中列表项的数量。
int InsertColumn(int nCol,const LVCOLUMN* pColumn );
int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT,int nWidth = -1,int nSubItem = -1 );
这两个函数用于在报表式列表视图控件中插入列。第一个函数中,nCol参数为插入列的索引,pColumn参数指向LVCOLUMN结构,其中包含了插入列的属性。第二个函数中,nCol参数也是插入列的索引,lpszColumnHeading参数为列标题字符串,nFormat参数为列中文本的对齐方式,可以是LVCFMT_LEFT、LVCFMT_RIGHT或LVCFMT_CENTER,nWidth参数为列宽,nSubItem为插入列对应列表子项的索引。两个函数在成功时都返回新列的索引,失败都返回-1。
BOOL DeleteColumn(int nCol);
该函数用于删除列表视图控件中的某列。参数nCol为删除列的索引。删除成功则返回TRUE,失败返回FALSE。
int InsertItem(int nItem,LPCTSTR lpszItem);
向列表视图控件中插入新的列表项。参数nItem为要插入项的索引,参数lpszItem为要插入项的标签字符串。如果插入成功则返回新列表项的索引,否则返回-1。
BOOL DeleteItem(int nItem);
从列表视图控件中删除某个列表项。参数nItem指定了要删除的列表项的索引。删除成功则返回TRUE,否则返回FALSE。
CString GetItemText(int nItem,int nSubItem) const;
获取指定列表项或列表子项的显示文本。参数nItem指定了列表项的索引,参数nSubItem指定了列表子项的索引。
BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText);
设置指定列表项或列表子项的显示文本。参数nItem和nSubItem同GetItemText。参数lpszText为要设置的显示文本字符串。如果设置成功则返回TRUE,否则返回FALSE。
DWORD_PTR GetItemData(int nItem) const;
该函数用于获取指定列表项的附加32位数据。参数nItem为列表项的索引。返回值就是由nItem指定列表项的附加32位数据。
BOOL SetItemData(int nItem,DWORD_PTR dwData);
该函数用于为指定列表项设置附加32位是数据。参数nItem为列表项的索引,参数dwData为列表项的附加32位数据。
添加CListCtrl类型的控件变量m_programLangList,然后修改OnInitDialog()函数为:
1. // when the application's main window is not a dialog
2. SetIcon(m_hIcon, TRUE); // Set big icon
3. SetIcon(m_hIcon, FALSE); // Set small icon
4.
5. // TODO: Add extra initialization here
6. CRect rect;
7.
8. // 获取列表视图控件的位置和大小
9. m_programLangList.GetClientRect(&rect);
10.
11. // 为列表视图控件添加全行选中和栅格风格
12. m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
13.
14. // 为列表视图控件添加三列
15. m_programLangList.InsertColumn(0, _T("语言"), LVCFMT_CENTER, rect.Width()/3, 0);
16. m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);
17. m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);
18.
19. // 在列表视图控件中插入列表项,并设置列表子项文本
20. m_programLangList.InsertItem(0, _T("Java"));
21. m_programLangList.SetItemText(0, 1, _T("1"));
22. m_programLangList.SetItemText(0, 2, _T("1"));
23. m_programLangList.InsertItem(1, _T("C"));
24. m_programLangList.SetItemText(1, 1, _T("2"));
25. m_programLangList.SetItemText(1, 2, _T("2"));
26. m_programLangList.InsertItem(2, _T("C#"));
27. m_programLangList.SetItemText(2, 1, _T("3"));
28. m_programLangList.SetItemText(2, 2, _T("6"));
29. m_programLangList.InsertItem(3, _T("C++"));
30. m_programLangList.SetItemText(3, 1, _T("4"));
31. m_programLangList.SetItemText(3, 2, _T("3"));
32.
33. return TRUE; // return TRUE unless you set the focus to a control
为列表框添加事件处理程序,选择NM_CLICK通知消息,点击列表框中的内容,并在编辑框中显示:
1. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
2. // TODO: Add your control notification handler code here
3. *pResult = 0;
4.
5. CString strLangName; // 选择语言的名称字符串
6. NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;
7.
8. if (-1 != pNMListView->iItem) // 如果iItem不是-1,就说明有列表项被选择
9. {
10. // 获取被选择列表项第一个子项的文本
11. strLangName = m_programLangList.GetItemText(pNMListView->iItem, 0);
12. // 将选择的语言显示与编辑框中
SetDlgItemText(IDC_EDIT1, strLangName);