跟我一起玩Win32开发(15):ListView控件

摘要:
我们希望使用ListView显示一些学生信息。显然,每个学生信息有三个字段,ListView有多个视图,如图所示:列表小图标大图标平铺详细视图我们希望显示多个字段,因此我们应该选择最后一个视图。将View属性设置为Report。这样,LV控件有三列,如下所示。

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

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

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

跟我一起玩Win32开发(15):ListView控件第1张

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

跟我一起玩Win32开发(15):ListView控件第2张

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

跟我一起玩Win32开发(15):ListView控件第3张

跟我一起玩Win32开发(15):ListView控件第4张

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

跟我一起玩Win32开发(15):ListView控件第5张

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

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

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

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

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

列表小图标

跟我一起玩Win32开发(15):ListView控件第6张

大图标

跟我一起玩Win32开发(15):ListView控件第7张
平铺

跟我一起玩Win32开发(15):ListView控件第8张

详细视图

跟我一起玩Win32开发(15):ListView控件第9张

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

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

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

跟我一起玩Win32开发(15):ListView控件第10张

设置View属性为Report。

跟我一起玩Win32开发(15):ListView控件第11张

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

[cpp] view plain copy
 
  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控件就有了三个列了,就像这样。

跟我一起玩Win32开发(15):ListView控件第12张

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

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

[cpp] view plain copy
 
  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.         //求出数组中元素的个数  
  14.         int arrCount = (int)(sizeof(stu) / sizeof(stu[0]));  
  15.         LVITEM vitem;  
  16.         vitem.mask = LVIF_TEXT;  
  17.         for (int i = 0; i < arrCount; i++)  
  18.         {  
  19.             /* 
  20.                 策略: 
  21.                 先添加项再设置子项内容 
  22.             */  
  23.             vitem.pszText = stu[i].Name;  
  24.             vitem.iItem = i;  
  25.             vitem.iSubItem = 0;  
  26.             ListView_InsertItem(hListview, &vitem);  
  27.             // 设置子项  
  28.             vitem.iSubItem = 1;  
  29.             vitem.pszText = stu[i].Age;  
  30.             ListView_SetItem( hListview, &vitem);  
  31.             vitem.iSubItem = 2;  
  32.             vitem.pszText = stu[i].Address;  
  33.             ListView_SetItem(hListview, &vitem);  
  34.         }  
  35.     }  
  36.     else if(LOWORD(wParam) == IDC_BTNCLEAR)  
  37.     {  
  38.         // 清除ListView中的所有项  
  39.         ListView_DeleteAllItems(hListview);  
  40.     }  
  41.     return 0;  


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

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

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

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

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

最后,看一下最终结果。

跟我一起玩Win32开发(15):ListView控件第13张

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

免责声明:文章转载自《跟我一起玩Win32开发(15):ListView控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js 用blob来显示存储资源,并清除其他资源MongoDB Python官方驱动 PyMongo 的简单封装下篇

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

相关文章

ScrollView里面添加ListView时,解决ListView的显示问题

在ScrollView里面添加ListView时,看了很多其他人的讲述,好像ListView只显示一条信息,为此简单新写了一个ListView控件,在布局文件里调用就可以了,代码如下: 1:ScrollViewWithListView.java 1 package com.ghp.view; 2 3 import android.widget.Li...

ListView技巧

1)复用convertViewListView在需要显示Item的时候,会首先检查回收站里是否有缓存的item,如果发现有缓存的item,ListView会直接复用它,把它作为参数传递给Adapter的getView方法,参数名为convertView。所以如果convertView不为空,表明回收站中存在可以复用的Item,就不需要在创建新的Item了。...

ListView实现下拉刷新功能

  很久没有写博客了,感觉都懒惰了,今天说一下一个自定义的空间,就是ListView下拉列表可以刷新的功能,相信很多同学都看到过这种功能,最典型的就是新浪微博的下拉刷新列表了。   废话不多说,首先呢,下拉刷新的那个带有progressBar的是ListView的headView,所以首先我们需要自定义一个HeadView,如下所示: 1 <?xm...

C#winform中ListView的使用

使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览、重命名、删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs 1 using System; 2 using System.Collections.Generic; 3 using System....

Android中ListView的总结(1)

这ListView真是麻烦,一个小小的FileBrowser废了将近2天。看来自己的功力还需要加强。 做FileBrowser中遇到几个ListView问题总结一下。 1、自定义样式   ListView其实和Asp.net里面的Repeater有点像,但是不同的是项的内容可以用一个layout文件来套用,这个比较有意思,毕竟刚开始研究android姑且叫...

CListCtrl使用技巧

以下未经说明,listctrl默认view 风格为report 1. CListCtrl 风格       LVS_ICON: 为每个item显示大图标       LVS_SMALLICON: 为每个item显示小图标       LVS_LIST: 显示一列带有小图标的item       LVS_REPORT: 显示item详细资料       直观的...