转自:http://www.jizhuomi.com/software/195.html

     列表视图控件简介

列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁、直观,在实际应用中能为用户带来方便。

列表视图控件是对前面讲到的列表框控件List Box的改进和延伸。列表视图控件的列表项一般有图标(Icon)和标签(Label)两部分。图标是对列表项的图形描述,标签是文字描述。当然列表项可以只包含图标也可以只包含标签。

列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:

Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。

Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。

List列表风格:与小图标风格类似,图标和文字的对齐方式不同。

Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。

列表视图控件的通知消息

VS2010/MFC编程入门之五(MFC消息映射机制概述)中的“各种Windows消息的消息处理函数”部分,曾以列表视图控件为例简单讲了WM_NOTIFY通知消息及其消息映射入口和消息处理函数的形式。如果你忘记了可以回到第五节看一看,回忆一下。

这里给出下一节中将要演示的列表视图控件实例中,通知码为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 = ;
}

我们看到,上面的代码中将NMHDR指针类型的pNMHDR强制转换为LPNMITEMACTIVATE类型的pNMItemActivate,那么我们就可以在函数中通过pNMHDR来访问NMHDR结构,也可以通过pNMItemActive指针变量来访问第一个元素为NMHDR结构体变量的扩充结构。

当然列表视图控件还有一些自己特有的通知消息,下面就介绍几个其中比较常用的。

LVN_ITEMCHANGING 和LVN_ITEMCHANGED:当列表视图的状态发生变化时,会发送这两个通知消息。例如,当用户选择了新的列表项时,程序就会收到这两个消息。消息会附带一个指向NMLISTVIEW 结构的指针,消息处理函数可从该结构中获得状态信息。两个消息的不同之处在于,前者的消息处理函数如果返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变。

LVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMLVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。

LVN_BEGINLABELEDIT 和LVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑标题时发送。消息会附带一个指向NMLVDISPINFO结构的指针。在前者的消息处理函数中,可以调用GetEditControl成员函数返回一个指向用于编辑标题的编辑框的指针,如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMLVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText 为NULL,那么说明用户放弃了编辑,否则,程序应负责更新表项的标题,这可以由SetItem或SetItemText函数来完成。

列表视图控件的相关结构体

下面我们来介绍一下与列表视图控件有关的一些结构体。

 1. NMHDR结构体

C++代码
typedef struct tagNMHDR
{
HWND hwndFrom; // 控件窗口的句柄
UINT_PTR idFrom; // 控件ID
UINT 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 columns
PUINT 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的一些成员函数和应用实例。

VS2010-MFC(常用控件:列表视图控件List Control 上)的更多相关文章

  1. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)

    上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...

  2. VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)

    前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用.      列表视图控件简介 列表视图控件List Control同样比较常见, ...

  3. MFC编程入门之二十八(常用控件:列表视图控件List Control上)

    前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...

  4. MFC常用控件之列表视图控件(List Control)

    近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...

  5. VS2010-MFC(常用控件:列表视图控件List Control 下)

    转自:http://www.jizhuomi.com/software/197.html 上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构 ...

  6. win32 sdk列表视图控件(ListCtrl或ListView)资料整理

    列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来.与树视图类似,列表控件可以由多个子项目组成,可以设置为Icon ...

  7. (七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static

    1,模态对话框和非模态对话框 // 模态对话框 void CMainFrame::OnDialogExec() { // TODO: 在此添加命令处理程序代码 // 创建对话框对象 CDialog d ...

  8. VS2010/MFC常用控件:图片控件Picture Control

    图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...

  9. Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 下拉刷新 ...

随机推荐

  1. FreeMarker简单入门到使用

    FreeMarker freemarker是一个用java开发的模版引擎,百度百科: 常用的java模版还有快要被抛弃的Jsp(熟悉).Thymeleaf(了解).Velocity(不知) freem ...

  2. IDEA 注解开发流程

    IDEA 注解开发流程  分为以下四步  分别是 1 导入依赖 2 配置文件 applicationContext.xml 3 在需要创建对象的类上添加注解 4  测试 详细步骤和代码如下 1 导入依 ...

  3. thinkphp自动创建目录

    自动创建目录 在第一次访问应用入口文件的时候,会显示如图所示的默认的欢迎页面,并自动生成了一个默认的应用模块Home. 接下来再看原来空的Application目录下面,已经自动生成了公共模块Comm ...

  4. NX二次开发-UF_MODL_ask_distance_tolerance获取建模的长度公差

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...

  5. Python 查看QQ状态

    import requests """ 该程序依赖于QQ的端口程序 返回数据:String,Y = 在线:N = 离线:E = QQ号码错误:A = 商业用户验证失败:V ...

  6. iOS之NSArray数组排序

    一.数组遍历 除了常用的for和for-in遍历外,系统还提供了三种枚举遍历,对于大量的数据遍历可以使用下列三个方法. - (void)enumerateObjectsUsingBlock:(void ...

  7. HDU1556-Color the ball-前缀和/线段树/树状数组

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  8. 2019 牛客多校第六场 B Shorten IPv6 Address

    题目链接:https://ac.nowcoder.com/acm/contest/886/B 题目大意 给定一个 128 位的二进制 ip 地址,让你以 16 位一组,每组转成 16 进制,用冒号连接 ...

  9. Python3 From Zero——{最初的意识:002~字符串和文本}

    一.使用多个界定符分割字符串 字符串.split(',')形式只适用于单一分割符的情况:多分割符同时应用的时候,可使用re.split() >>> line = 'asdf fjdk ...

  10. 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag

    1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...