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

我们为ListView中显示的数据加上图标,并且允许用户选择显示哪种视图,如大图标,小图标,详细信息等。

因为代码还比较长,我也不希望把代码全部放出来,在写完本文后,我会将源码上传到资源中。当然了,我也不可能说每一行代码都解释一遍,那也不现实,而且,这样也不好,我不能主观地去怀疑读者的领悟能力。

一、准备图标

既然要用到图标,为了简单方便,就用VS的资源编辑器随便画几下就有图标了,我们要准备两个图标,为什么呢?第一个图标是给EXE文件用的,而第二个图标是用在ListView中的。因为在生成的.exe文件的图标是选用我们最先添加到资源中的图标,为了使.EXE文件的图标和我们在ListView中用的图标不要一样(这样不好看),所以我们还是准备两个图标好一点。

图标中具备两个尺寸就够了——16*16和32*32,如果可能尽量用24位图,这样你能用更多的颜色。

二、如何切换视图

改变ListView的视图,可以使用ListView_SetView宏,发送LVM_SETVIEW消息也可以,不过使用宏更方便。它的第一个参数指定LV控件的句柄,第二个参数是设置用哪个视图。

LV_VIEW_DETAILS——详细视图。

LV_VIEW_ICON——大图标列表。

LV_VIEW_LIST——列表视图。

LV_VIEW_SMALLICON——小图标。

LV_VIEW_TILE——平铺,如果我没记错的话,这个视图是在XP时引入的。

三、ComboBox控件使用

为了可以让用户选择一个视图,自然要提供对应的操作界面,这是一种多选一的方式,用单选按钮和下拉拉表框都可以,不过,单选按钮要占用更多地方而且处理的消息更多,相对麻烦,所以,还是ComboBox好一些。

用ComboBox_AddString宏就可以向ComboBox中添加项,比如本例。

  1. // 初始化ComboBox,以选择视图
  2. hcbb = GetDlgItem(hDlg, IDC_CBVIEW);
  3. ComboBox_AddString(hcbb, L"大图标");
  4. ComboBox_AddString(hcbb, L"小图标");
  5. ComboBox_AddString(hcbb, L"列表");
  6. ComboBox_AddString(hcbb, L"详细");

当用户操作了ComboBox,它同样会发送一条WM_COMMAND消息,而我们之前已经响应过这条消息,看看例子,我们前面有一个“添加”按钮和一个“清除”按钮,它被点击后也会发送WM_COMMAND消息。因此,我们要做更详细的处理。

还记得吧,WM_COMMAND的wParam参数的低字节位表示发送该消息的控件的ID,高字节位表示“通知码”。lParam是控件的句柄。我们判断ID知道用户操作的是ComboBox控件还不够,因为我不知道用户对这个控件做了哪些操作,是弹出下拉列表?还是收起下拉列表?或者选择了另一个项?

而我们这里要做的是,看用户选择了哪个视图,我们的ListView控件就显示哪种视图,显然,在通知码中,我们是对CBN_SELCHANGE感兴趣,因为选择的索引值一旦改变,就会收到这个通知码。

  1. case IDC_CBVIEW:
  2. if (HIWORD(wParam) == CBN_SELCHANGE)
  3. {
  4. //  当前选择项的索引
  5. int index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
  6. // 根据选择设置视图
  7. DWORD lvView;
  8. switch (index)
  9. {
  10. case 0:
  11. lvView = LV_VIEW_ICON;
  12. break;
  13. case 1:
  14. lvView = LV_VIEW_SMALLICON;
  15. break;
  16. case 2:
  17. lvView = LV_VIEW_LIST;
  18. break;
  19. case 3:
  20. lvView = LV_VIEW_DETAILS;
  21. break;
  22. default:
  23. lvView = LV_VIEW_DETAILS;
  24. break;
  25. }
  26. ListView_SetView(GetDlgItem(hDlg, IDC_LV), lvView);
  27. }
  28. break;
  29. }

发送CB_GETCURSEL消息,可以得到ComboBox中当前选定项的索引值。

四、向ListView添加图标

先用ImageList_Create创建图像列表,然后用ImageList_AddIcon宏向列表中添加图标。因为我们要用大图标和小图标,所以要创建两个图像列表,一个放置大图标,另一种放置小图标,因为同一个Image List中放置的所有图像的尺寸必须相同。

  1. // 初始化ImageList
  2. hImgListSm = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_MASK,1,0);
  3. hImgListLg = ImageList_Create(GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),ILC_MASK,1,0);
  4. hicon = LoadIcon(hgAppInst,MAKEINTRESOURCE(IDI_ITE));
  5. // 添加图标
  6. ImageList_AddIcon(hImgListSm, hicon);
  7. ImageList_AddIcon(hImgListLg, hicon);
  8. DestroyIcon(hicon);

接着,用ListView_SetImageList把Image List和ListView关联起来。

  1. // 将ListView与ImageList关联
  2. ListView_SetImageList(hListview, hImgListLg, LVSIL_NORMAL);
  3. ListView_SetImageList(hListview, hImgListSm, LVSIL_SMALL);

在向ListView添加项时,设置LVITEM结构体的iImage字段为图像列表中对应图像的索引,因为我们只添加了一个图标,所以,索引是0.

  1. LVITEM vitem;
  2. vitem.mask = LVIF_TEXT | LVIF_IMAGE;
  3. vitem.iImage = 0;

ImageList_Create返回的是一个句柄,它也是一种资源,所以,在不需要它了,就得记得把它销毁。在我们的对话框发生WM_DESTROY的同时将其销毁。

  1. case WM_SYSCOMMAND:
  2. if (wParam == SC_CLOSE)
  3. {
  4. // 销毁ImageList
  5. ImageList_Destroy(hImgListLg);
  6. ImageList_Destroy(hImgListSm);
  7. DestroyWindow(hListview);//不再需要
  8. DestroyWindow(hDlg);
  9. }
  10. return 0;

另外,补充一个小知识,要得到对话框中某个控件的句柄,可以调用GetDlgItem函数,这也是我们为什么要为控件设置ID值的原因。

程序运行后,就可以通过选择下拉列表来动态改变ListView的视图了。

好了,要过年了,这是新年前最后一篇博文,过完年后,我们继续。我也希望,后续能与大家一起分享更多的知识和编程技巧。

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

祝大家

新春快乐,生活愉快,身体健康,工作顺利,明年更有成就。

祝各位以及各位的亲朋好友们,新年快乐。

跟我一起玩Win32开发(16):ListView的多个视图的更多相关文章

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

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

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

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

  3. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

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

    这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见.当然也可以说,它是对ListBox的扩充. 在使用该控件之前,我先介绍VS的一个相当好玩的功能. 在代码文件的#inc ...

  5. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  6. 跟我一起玩Win32开发(19):浏览和打开文件

    在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...

  7. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  8. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...

  9. 跟我一起玩Win32开发(2):完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

随机推荐

  1. A&DCTF

    ADCTF  WRITEUP 方向:Reverse  解题数:2 题目:Reverse_01 解题过程: 用ida打开反汇编查看代码,看main函数发现 关键部分,字符串比较,竟然是直接比较”is_t ...

  2. Android版DesiredCapabilities参数配置

    前言 每一个App测试都应指定是在什么平台下,那个设备中运行那个App,而在Appium中主要是通过DesiredCapabilities来配置的. DesiredCapabilities的作用,负责 ...

  3. C++中的const完全解析

    1. const修饰普通变量和指针 const修饰变量,一般有两种写法:const TYPE value;TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类 ...

  4. Memory cycles about Block

    Block keeps a strong point to all object referenced in side of them, so all object will stay in heap ...

  5. spring、spring MVC、spring Boot

    Spring 是一个“引擎” Spring MVC 是基于 Spring 的一个 MVC 框架 Spring Boot 是基于 Spring4 的条件注册的一套快速开发整合包 Spring 最初利用“ ...

  6. react native 知识点总结(一)

    一.关于react native 版本的升级 参照文档:http://reactnative.cn/docs/0.45/upgrading.html react-native -v   查看当前版本 ...

  7. bzoj5483: [Usaco2018 Dec]Balance Beam

    又又又又又又又被踩爆了 首先容易写出这样的期望方程:f(1)=max(d(1),f(2)/2),f(n)=max(d(n),f(n-1)/2), f(i)=max(d(i),(f(i-1)+f(i+1 ...

  8. 广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告

    题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ...

  9. 书写优雅的shell脚本(插曲) - kill

    shell之kill.killall.xkill.pkill 2013-01-08 22:03:28|  分类: Linux|举报|字号订阅 1 kill kill的应用是和ps 或pgrep 命令结 ...

  10. iOS 开发图片资源选择png格式还是jpg格式

    对于iOS本地应用程序来说最简单的答案就是始终使用PNG,除非你有非常非常好的理由不用它. 当iOS应用构建的时候,Xcode会通过一种方式优化.png文件而不会优化其它文件格式.它优化得相当的好 他 ...