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

摘要:
在上一节中,我们讨论了图片控件PictureControl。本节介绍列表视图控件ListControl的使用。列表视图控件简介列表视图控件也是常见的。它可以在列表中显示任何字符串内容。这种显示方式干净直观,在实际应用中可以给用户带来方便。列表视图控件是前面提到的列表控件ListBox的改进和扩展。LVN_ITEMCHANGING和LVN_ITEMC HANGED:当列表视图的状态更改时,将发送这两条通知消息。LVN_KEYDOWN:此消息表示键盘事件。

  前面一节中,讲了图片控件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上)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NodeJS Express博客项目实战 之 管理员查看功能和无刷新修改状态未安装git lfs导致git下载不完整,没有错误提示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

002输入子系统驱动

输入子系统概念介绍(第十三课/第一节) 回顾第三个驱动程序(中断方式的按键驱动程序)和测试程序,发现有一些缺点:这个驱动程序没办法用在别人写的现成的应用程序上(比如:QT),因为别人写的应用程序肯定不会来打开你这个"/dev/third_chrdev"。别人打开的是一些现成的设备(比如:/dev/tty),甚至别人都不打开设备,而是直接调用 scanf()...

Android智能指针sp wp详解

研究Android的时候,经常会遇到sp、wp的东西,网上一搜,原来是android封装了c++中对象回收机制。说明:1. 如果一个类想使用智能指针,那么必须满足下面两个条件:a. 该类是虚基类RefBase的子类或间接子类b. 该类必须定义虚构造函数。如virtual ~MyClass(); 2. 本文以类BBinder来进行说明,其余类使用sp或wp...

1、结构体

1、为什么需要结构体   为了表示一些复杂的事物,而普通的基本类型无法满足实际要。 2、求什么叫结构体  把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体。 3、如何定义结构体 /*---------------------------------------------- 结构体的定义方式 ---------------------...

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐。在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用。另外,一些不用边界对齐、可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内。 什么是地址对齐 计算机读取或者写入...

深入浅出Visual C++动态链接库(Dll)编程

文章作者:宋宝华信息来源:天极网原始连接: http://soft.yesky.com/lesson/318/2166818.shtml?412  动态链接库(DLL)是Windows系统的核心,也是COM技术的基础,因此突破动态链接库一直是技术人员的攻坚目标,本期专题将由浅入深的介绍动态链接库的基础慨念、分类、实现和应用。基础慨念1.概论 先来阐述一...

mfc修改主窗口风格和窗口类 .

AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名、窗口是叠加型的、可改变窗口大小等。要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs。CWnd::PreCreateWindow 函数先于窗口...