在上一个例子中,我们只用到了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. vue的安装以及语法介绍

    #需要用到一个vue文件,还有一个自己的js文件main.js<!DOCTYPE html> <html lang="en"> <head> & ...

  2. appium 查错

    很高兴最近论坛用appium的人多了不少,但也有不少由于不了解appium导致出现错误后不知道从何下手.这里根据我的个人经验给出一个简单的查错指南,不保证能解决所有错误,但至少让你知道你应该朝哪个方向 ...

  3. Python开发【2.3 模块】

    1.模块导入 import 模块名 from 模块名 import 函数/类/变量 2.模块路径 import sys sys.path 3.模块重新导入 Python3若想在同一次会话中再次运行文件 ...

  4. solr单机多实例部署文件锁冲突解决的方法

    给出一个有问题的单机多tomcat实例引用同一个solr实例部署图. 这样的部署必定造成一个问题.启动第二个tomcat实例时,一定会报索引目录文件锁已经被占用. 最初的解决的方法是.有多少个tomc ...

  5. exists用在linq上

    SQL里面,有时候会用到exists或者not exists. select * from yb t1 where not exists(select 1 from yb t2 where trunc ...

  6. python day-3 基本数据类型

    1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...

  7. XML复习笔记(复习资料为菜鸟教程里的XML教程)

    XML 指可扩展标记语言(eXtensible Markup Language) XML 的设计宗旨是传输数据,而不是显示数据. XML 标签没有被预定义.您需要自行定义标签. XML 被设计为具有自 ...

  8. html5--6-40 CSS边框

    html5--6-40 CSS边框 实例 div动态阴影 学习要点 掌握CSS边框属性的使用 元素的边框就是围绕元素内容和内边距的一条或多条线. 元素的边框属性: border 简写属性,用于把针对四 ...

  9. android:oneshot

    帧动画的自动执行:oneshot . 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放.

  10. [Selenium] 操作 HTML5 中的 Canvas 绘制图形

    测试 http://literallycanvas.com/ 以 Chrome Driver 为例阐述,通过 Actions 在 Canvas 上绘制一个封闭图形.对于 Canvas 上的操作,推荐 ...