前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用。
前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用。内容正式开始前为大家介绍一下MFC中著名的控件Xtreme ToolKit Pro:

列表视图控件简介
列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁、直观,在实际应用中能为用户带来方便。
列表视图控件是对前面讲到的列表框控件List Box的改进和延伸。列表视图控件的列表项一般有图标(Icon)和标签(Label)两部分。图标是对列表项的图形描述,标签是文字描述。当然列表项可以只包含图标也可以只包含标签。
列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:
Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。
Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。
List列表风格:与小图标风格类似,图标和文字的对齐方式不同。
Report 表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种 表。
列表视图控件的通知消息
这里给出下一节中将要演示的列表视图控件实例中,通知码为NM_CLICK的通知消息的消息映射入口:
ON_NOTIFY(NM_CLICK, IDC_PROGRAM_LANG_LIST, &CExample29Dlg::OnNMClickProgramLangList)
C++代码
void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult){LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: Add your control notification handler code here*pResult = 0;}
我们看到,上面的代码中将NMHDR指针类型的pNMHDR强制转换为LPNMITEMACTIVATE类型的pNMItemActivate,那么我们就可以在函数中通过pNMHDR来访问NMHDR结构,也可以通过pNMItemActive指针变量来访问第一个元素为NMHDR结构体变量的扩充结构。
当然列表视图控件还有一些自己特有的通知消息,下面就介绍几个其中比较常用的。
LVN_ITEMCHANGING 和LVN_ITEMCHANGED:当列表视图的状态发生变化时,会发送这两个通知消息。例如,当用户选择了新的列表项时,程序就会收到这两个消息。
消息会附带一个指向NMLISTVIEW 结构的指针,消息处理函数可从该结构中获得状态信息。两个消息的不同之处在于,前者的消息处理函数如果返回TRUE,那么就阻
止选择的改变,如果返回FALSE,则允许改变。
LVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMLVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。
列表视图控件的相关结构体
下面我们来介绍一下与列表视图控件有关的一些结构体。
1. NMHDR结构体
C++代码
typedef struct tagNMHDR {HWND hwndFrom; // 控件窗口的句柄UINT_PTR idFrom; // 控件IDUINT code; // 控件的通知消息码} NMHDR;
此结构体在很多情况下都是其他扩充结构体的第一个元素,比如上面的NMITEMACTIVATE结构体:
C++代码
typedef struct tagNMITEMACTIVATE {NMHDR hdr;int iItem;int iSubItem;UINT uNewState;UINT uOldState;UINT uChanged;POINT ptAction;LPARAM lParam;UINT uKeyFlags;} NMITEMACTIVATE, *LPNMITEMACTIVATE;
2. LVITEM 结构体
该结构体包含了列表视图控件中列表项或列表子项的各种属性。
C++代码
typedef struct _LVITEM {UINT mask; // 掩码位的组合(下面有对应掩码的元素都已在括 中标出掩码),表明哪些元素是有效的int iItem; // 列表项的索引int iSubItem; // 列表子项的索引UINT state; // 状态,下面会列出。(LVIF_STATE)UINT stateMask; // 状态掩码,用来说明要获取或设置哪些状态。下面会列出LPTSTR pszText; // 指向列表项或列表子项的标签字符串。(LVIF_TEXT)int cchTextMax; // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVIF_TEXT)int iImage; // 图标的索引。(LVIF_IMAGE)LPARAM lParam; // 32位的附加数据。(LVIF_PARAM)#if (_WIN32_IE >= 0x0300)int iIndent;#endif#if (_WIN32_WINNT >= 0x501)int iGroupId;UINT cColumns; // tile view columnsPUINT puColumns;#endif#if (_WIN32_WINNT >= 0x0600)int* piColFmt;int iGroup;#endif} LVITEM, *LPLVITEM;
下面是state和stateMask的取值及含义:
状态 对应的状态掩码 含义
LVIS_CUT 同左 列表项或列表子项被选择用来进行剪切和粘贴操作
LVIS_DROPHILITED 同左 列表项或列表子项成为拖动操作的目标
LVIS_FOCUSED 同左 列表项或列表子项具有输入焦点
LVIS_SELECTED 同左 列表项或列表子项被选中
3. LVCOLUMN结构体
该结构体仅适用于Report 表式列表视图控件。在向列表控件中插入一列时需要用到此结构体。它包含了列表控件某列的各种属性。
C++代码
typedef struct _LVCOLUMN {UINT mask; // 掩码位的组合(下面有对应掩码的元素都已在括 中标出掩码),表明哪些元素是有效的int fmt; // 该列的表头和列表子项的标签正文显示格式,可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT。(LVCF_FMT)int cx; // 以像素为单位的列的宽度。(LVCF_FMT)LPTSTR pszText; // 指向列表头标题正文的字符串。(LVCF_TEXT)int cchTextMax; // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVCF_TEXT)int iSubItem; // 该列的索引。(LVCF_SUBITEM)#if (_WIN32_IE >= 0x0300)int iImage;int iOrder;#endif#if (_WIN32_WINNT >= 0x0600)int cxMin;int cxDefault;int cxIdeal;#endif} LVCOLUMN, *LPLVCOLUMN;
4. NMLISTVIEW结构体
该结构体存放了列表视图控件通知消息的相关信息。列表视图控件的大部分通知消息都会附带指向该结构体的指针。
C++代码
typedef struct tagNMLISTVIEW {NMHDR hdr; // 标准的NMHDR 结构int iItem; // 列表项的索引int iSubItem; // 列表子项的索引UINT uNewState; // 列表项或列表子项的新状态UINT uOldState; // 列表项或列表子项原来的状态UINT uChanged; // 取值与LVITEM的mask成员相同,用来表明哪些状态发生了变化POINT ptAction; // 事件发生时鼠标的客户区坐标LPARAM lParam; //32位的附加数据} NMLISTVIEW, *LPNMLISTVIEW;
有关列表视图控件的内容本节先讲这些,下节继续讲列表控件类CListCtrl的一些成员函数和应用实例。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!