在上一个例子中,我们只用到了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. ios自动生成对象类,提高开发速率

    #import "autoGenerationFileUtility.h" @implementation autoGenerationFileUtility - (void)cr ...

  2. SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)

    Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...

  3. var let Hositing const Temporal Dead Zone

    var  let  Hositing const Temporal Dead Zone 临时死区

  4. Aspose 直接插入SQL Server DataTalbe

    原文链接:http://www.cnblogs.com/hellohongfu/p/7362830.html 下面的代码可以根据excel文件,生成创建表的SQL,以及测试InsertSQL .方法将 ...

  5. Velocity模板引擎笔记

    模板引擎中判断对象是否为空: #if(!${jsonObj.data.buyerName} || ${jsonObj.data.buyerName} == '')         <p>采 ...

  6. 如何使用git 生成patch 和打入patch【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用 ...

  7. css中链接的4个状态 link、visited 、hover、active 顺序与设置

    link       未点时链接色visited  已点过的链接色hover   光标放入链接上的色active   点击时的样式 顺序一定要按link.visited.hover.active来设置 ...

  8. 接口_简单get接口_第一个接口

    import flask,json # print(__name__) ##__name__代表当前这个python文件 server = flask.Flask(__name__) #把咱们当前的这 ...

  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. js获取form的方法

    先来看下面代码: ? <html> <head> <scirpy> window.onload=function(){    var f1=document.f1; ...