这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见。当然也可以说,它是对ListBox的扩充。

在使用该控件之前,我先介绍VS的一个相当好玩的功能。

在代码文件的#include指令上右击,从弹出的菜单中选择“生成包含文件关系图”,如下图:

然后你喝一口咖啡,你会看到这样的东西:

这个关系图,演示了你的项目中的头文件,源文件以及外部引用文件之间的关系。把鼠标移到上面,滚动滑轮,可以缩放大小。把鼠标移到“外部”节点上,点击左边的向下箭头,可以看到本项目与外部头文件的关系。

所以,如果你的程序比较复杂,头文件众多,不妨试试这功能。

=====================================================

下面我们来使用ListView来显示一组数据,我定义了一个结构体:

  1. // 用于测试的结构体
  2. struct STUDENTINFO
  3. {
  4. WCHAR Name[15];
  5. WCHAR Age[3];
  6. WCHAR Address[50];
  7. };

假设它代表了一位学员的信息——姓名、年龄、地址。

我们要用ListView来显示一些学员的信息,显然,每一个学员信息都有三个字段,ListView有多种视图,如图:

列表小图标

大图标


平铺

详细视图

我们要显示多个字段,故应选择最后一种视图。

好,下面我们就做一个练习,实例是检验学习成果的唯一标准。

1、新建一个对话框资源,在设计器中拖一个List Control和两个Button,List Control其实就是ListView控件。

设置View属性为Report。

2、在对话框消息处理函数中,处理WM_INITDIALOG消息,向ListView添加列。

  1. case WM_INITDIALOG:
  2. // 获取ListView控件的句柄
  3. hListview = GetDlgItem(hDlg, IDC_LV);
  4. // 设置ListView的列
  5. LVCOLUMN vcl;
  6. vcl.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
  7. // 第一列
  8. vcl.pszText = L"姓名";//列标题
  9. vcl.cx = 90;//列宽
  10. vcl.iSubItem = 0;//子项索引,第一列无子项
  11. ListView_InsertColumn(hListview, 0, &vcl);
  12. // 第二列
  13. vcl.pszText = L"年龄";
  14. vcl.cx = 90;
  15. vcl.iSubItem = 1;//子项索引
  16. ListView_InsertColumn(hListview, 1, &vcl);
  17. // 第三列
  18. vcl.pszText = L"地址";
  19. vcl.cx = 200;
  20. vcl.iSubItem = 2;
  21. ListView_InsertColumn(hListview, 2, &vcl);
  22. return 0;

向LV添加列,调用ListView_InsertColumn宏,注意它是宏不是函数(你也可以发送LVM_INSERTCOLUMN消息),其中有一个参数是指向LVCOLUMN结构体的指针,关于这个结构体的成员我就不说了,有兴趣的看MSDN。

这样,LV控件就有了三个列了,就像这样。

3、另外两个按钮, 一个用来向LV中添加项,后一个是清除所有项。

还记得吧,要响应按钮单击,要处理WM_COMMAND消息,然后通过wParam参数的低字节位来判断用户点击了哪个按钮,指示了对应按钮的ID。

  1. case WM_COMMAND:
  2. if (LOWORD(wParam) == IDC_BTNADD)
  3. {
  4. STUDENTINFO stu[ ] = {
  5. { L"小刘", L"20", L"火星" },
  6. { L"老赵", L"21", L"木星" },
  7. { L"小胡", L"30", L"水星" },
  8. { L"老高", L"32", L"山沟一号" },
  9. { L"黄牛", L"24", L"不知哪个星球来的" },
  10. { L"王七", L"28", L"超人之乡" }
  11. };
  12. //求出数组中元素的个数
  13. int arrCount = (int)(sizeof(stu) / sizeof(stu[0]));
  14. LVITEM vitem;
  15. vitem.mask = LVIF_TEXT;
  16. for (int i = 0; i < arrCount; i++)
  17. {
  18. /*
  19. 策略:
  20. 先添加项再设置子项内容
  21. */
  22. vitem.pszText = stu[i].Name;
  23. vitem.iItem = i;
  24. vitem.iSubItem = 0;
  25. ListView_InsertItem(hListview, &vitem);
  26. // 设置子项
  27. vitem.iSubItem = 1;
  28. vitem.pszText = stu[i].Age;
  29. ListView_SetItem( hListview, &vitem);
  30. vitem.iSubItem = 2;
  31. vitem.pszText = stu[i].Address;
  32. ListView_SetItem(hListview, &vitem);
  33. }
  34. }
  35. else if(LOWORD(wParam) == IDC_BTNCLEAR)
  36. {
  37. // 清除ListView中的所有项
  38. ListView_DeleteAllItems(hListview);
  39. }
  40. return 0;

首先,为了在LV中加入数据,声明了一个STUDENT数组,STUDENT结构体在前面定义的,表示一位学员的信息。由于这个数组在声明的时候,并没有指定元素个数,在后面执行for循环添加项之前,先要知道数组中有多少个元素。

方法是用sizeof运算符取出整个数组的字节长度,然后除以第一个元素的长度,这样就求出元素的个数了。

向LV添加项,调用ListView_InsertItem宏,注意添加方法,要先添加项,随后再用ListView_SetItem宏来设置子项的内容。由于两个宏使用相同的参数,所以在循环前,我们都用一个LVITEM,在循环中我们只改变它的项索引值和文本内容再传到ListView_InsertItem宏或ListView_SetItem宏,这样也免得多次分配内存数据。

清除LV中的所有项,直接用ListView_DeleteAllItems宏就可以了。

以上操作也可以通过发送对应消息来完成,不过,直接调用宏似乎比SendMessage方便。

最后,看一下最终结果。

由于这个例子相对有些复杂,稍后我把代码上传到[资源]中。

跟我一起玩Win32开发(15):ListView控件的更多相关文章

  1. WP8.1开发中ListView控件加载图列表的简单使用(1)

    我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别 ...

  2. 跟我一起玩Win32开发(16):ListView的多个视图

    在上一个例子中,我们只用到了ListView的Report视图,也就是详细视图.本文我们再把上一篇文章中所用的例子进行一下扩展,例子源码可以到俺的资源区下载. 我们为ListView中显示的数据加上图 ...

  3. 跟我一起玩Win32开发(转自CSDN-东邪独孤)

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  4. 跟我一起玩Win32开发(17):启动和结束进程

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...

  5. 安卓开发——ListView控件(初始化ListView、列表刷新、长按添加menu)

    前言: ListView——列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大 ...

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

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

  7. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  8. 【Win 10应用开发】SplitView控件

    SplitView控件用于呈现分隔视图,简单地说,就是把一个视图分割为两部分,Content属性所表示的为主要视图,而Pane属性设置的视图则可以隐藏,可以折叠和展开. 估计文字是不太容易介绍这个控件 ...

  9. winform listview控件

    ListView控件 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设置 ...

随机推荐

  1. 细数AutoLayout以来UIView和UIViewController新增的相关API

    本文转载至 http://www.itjhwd.com/autolayout-uiview-uiviewcontroller-api/ 细数AutoLayout以来UIView和UIViewContr ...

  2. java学习方向及主要内容

    Java分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以java并不是单机版的,只是面向对象语言.建议如果学习java体系的话可以这样去学习: *第一阶段:J ...

  3. bash_action

    https://stackoverflow.com/questions/12076326/how-to-install-maven2-on-redhat-linux #!/bin/bash # Tar ...

  4. 按行读入xml文件,删除不需要的行 -Java

    删除挺麻烦的,这里其实只是把需要的行存到arraylist中再存到另一个文件中 import java.io.BufferedReader;import java.io.BufferedWriter; ...

  5. linux下自动创建设备文件节点---class

    在驱动模块初始化函数中实现设备节点的自动创建 我们在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的 ...

  6. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  7. DedeCms最新文章显示红色日期或加上new字或new小图片

    DedeCMS发布的文章显示红色日期或加上new字或new小图片,给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片等,都是围绕pubdate做文章,写扩展的. 1.红色的日期   ...

  8. Nhibernate开发中遇见的问题列表

    1.No persister for: LantrackCommon.pentity.BASESTANDARD 解答修改方法:我的是因为映射关系文件在属性里的生成操作设置成:嵌入的资源.

  9. codeforces 690C3 C3. Brain Network (hard)(lca)

    题目链接: C3. Brain Network (hard) time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  10. BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP

    BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...