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

时间:2022-08-30 11:03:47

  前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用。

  列表视图控件简介

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

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

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

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

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

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

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

  列表视图控件的通知消息

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

  这里给出下一节中将要演示的列表视图控件实例中,通知吗为NM_CLICK的通知消息的消息映射入口:

  ON_NOTIFY(NM_CLICK, IDC_PROGRAM_LANG_LIST, &CListControlDemoDlg::OnNMClickProgramLangList);

  还有消息处理函数自动生成时的形式:

C++代码:

void CListControlDemoDlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESUTL *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结构的指针,通过该结构程序可以获得按键的信息。

  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 iGtoupId;
UINT cColumns; // title view columns
PUINT puColumns;
#endif
#if (_WIN32_WINT >= 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的一些成员函数和应用实例。

  

MFC编程入门之二十八(常用控件:列表视图控件List Control上)的更多相关文章

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

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

  2. MFC编程入门之二十(常用控件:静态文本框)

    上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...

  3. VS2010&sol;MFC编程入门之二十(常用控件:静态文本框)

    上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...

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

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

  5. VS2010&sol;MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...

  6. MFC编程入门之二十五(常用控件:组合框控件ComboBox)

    上一节讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是组合框 ...

  7. MFC编程入门之二十四(常用控件:列表框控件ListBox)

    前面两节讲了比较常用的按钮控件,并通过按钮控件实例说明了具体用法.本文要讲的是列表框控件(ListBox)及其使用实例. 列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选 ...

  8. MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...

  9. 【转】VS2010&sol;MFC编程入门之二十五(常用控件:组合框控件Combo Box)

    原文网址:http://www.jizhuomi.com/software/189.html 上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常 ...

随机推荐

  1. CMS系统存储路径

    CMS系统特点:前后端分离 index.html 首页文件index.php 管理后台的页面 api文件夹: 提供的接口 caches文件夹: 缓存文件 html文件夹:  生成的静态页面 phpcm ...

  2. html中的空格显示问题

    像这种,从后台查询出来的数据中间有好几个空格,但在页面上显示的时候就只剩一个空格了,这种显示肯定是不合适的,相关的html代码如下: <c:forEach items="${list} ...

  3. alloc

    注意,凡是用到指针的地方,一定要在堆中分配空间,否则指针释放了,那就不能够传值了. 将一个对象作为另外一个对象的成员变量,可以直接将两个对象联系起来.

  4. 百度推出的echarts,制表折线图柱状图饼图等的超级工具&lpar;转&rpar;

    一.简介: 1.绘制数据图表,有了它,想要网页上绘制个折线图.柱状图,从此easy. 2.使用这个百度的echarts.js插件,是通过把图片绘制在canvas上在显示在页面上. 官网对echarts ...

  5. Codeforces Round &num;325 &lpar;Div&period; 1&rpar; D&period; Lizard Era&colon; Beginning

    折半搜索,先搜索一半的数字,记录第一个人的值,第二个人.第三个人和第一个人的差值,开个map哈希存一下,然后另一半搜完直接根据差值查找前一半的答案. 代码 #include<cstdio> ...

  6. &lpar;转&rpar;Objective-C中的instancetype和id区别

    有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, Objective-C is a rapidly evolving language, in a ...

  7. Caused by&colon; java&period;lang&period;ClassNotFoundException&colon; org&period;aspectj&period;lang&period;annotation&period;Around

    1.错误描述 INFO:2015-05-01 11:12:15[localhost-startStop-1] - Root WebApplicationContext: initialization ...

  8. Oracle 12c 之前的版本路线图

  9. URAL 1881 Long problem statement

    1881. Long problem statement Time limit: 0.5 secondMemory limit: 64 MB While Fedya was writing the s ...

  10. shell的uniq命令

    uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用. uniq 可检查文本文件中重复出现的行列. 命令语法: uniq [-c/d/D/u/i] [-f Fields ...