MFC编程入门之二十八(常用控件:列表视图控件List Control上)
前面一节中,讲了图片控件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上)的更多相关文章
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见, ...
- MFC编程入门之二十(常用控件:静态文本框)
上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...
- VS2010/MFC编程入门之二十(常用控件:静态文本框)
上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...
- VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...
- MFC编程入门之二十五(常用控件:组合框控件ComboBox)
上一节讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是组合框 ...
- MFC编程入门之二十四(常用控件:列表框控件ListBox)
前面两节讲了比较常用的按钮控件,并通过按钮控件实例说明了具体用法.本文要讲的是列表框控件(ListBox)及其使用实例. 列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选 ...
- MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)
本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...
- 【转】VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)
原文网址:http://www.jizhuomi.com/software/189.html 上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常 ...
随机推荐
- WMAppPRHeader.xml文件的作用
对于很多开发者来说直接通过Visual Studio 2010生成的XAP文件和上传至App Hub通过Windows Phone Marketplace Technical Certificatio ...
- IOS 图形上下文栈
- (void)drawRect:(CGRect)rect { // 获取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 保存一份最纯 ...
- openlayers 初步认识(转)
OpenLayers是一个开源的js框架,用于在您的浏览器中实现地图浏览的效果和基本的zoom,pan等功能.OpenLayers支持的地图来源 包括了WMS,GoogleMap,KaMap,MSVi ...
- hdu-3371 Connect the Cities---kruskal
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...
- Android(java)学习笔记86:Android提供打开各种文件的API接口:setDataAndType
1. Android 打开各种文件(setDataAndType) private void openFile(File file){ Intent intent = new Intent(); in ...
- imfilter()用法
功能:对图像进行滤波. 用法: g = imfilter(f, w, filtering_mode, boundary_options, size_options) 其中,f:输入图像,w:滤波掩模, ...
- angular6项目中使用echarts图表的方法(有一个坑,引用报错)
1.安装相关依赖(采用的webpack) npm install ecahrts --save npm install ngx-echarts --save 2.angular.json 配置echa ...
- 深入理解Java GC
一.概述 GC(Carbage Collection)垃圾收集器,由JVM自动回收已死亡的对象垃圾. 这也是Java与C++等语言的主要区别之一. 二.如何确认对象已死 1. 引用计数算法 引用计数法 ...
- Oracle 自动生成hive建表语句
从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...
- angular2的生命周期钩子的使用情况
angular 2 Directive Lifecycleangular2 中组建继承于指令,并扩展了与ui视图相关的属性.angular2 指令的生命周期是用来记录指令从创建,应用及销毁的过程.an ...