跟我一起玩Win32开发(16):ListView的多个视图
来源:互联网 发布:何为会穿衣服知乎 编辑:程序博客网 时间:2024/04/28 06:55
在上一个例子中,我们只用到了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中添加项,比如本例。
// 初始化ComboBox,以选择视图hcbb = GetDlgItem(hDlg, IDC_CBVIEW);ComboBox_AddString(hcbb, L"大图标");ComboBox_AddString(hcbb, L"小图标");ComboBox_AddString(hcbb, L"列表");ComboBox_AddString(hcbb, L"详细");
当用户操作了ComboBox,它同样会发送一条WM_COMMAND消息,而我们之前已经响应过这条消息,看看例子,我们前面有一个“添加”按钮和一个“清除”按钮,它被点击后也会发送WM_COMMAND消息。因此,我们要做更详细的处理。
还记得吧,WM_COMMAND的wParam参数的低字节位表示发送该消息的控件的ID,高字节位表示“通知码”。lParam是控件的句柄。我们判断ID知道用户操作的是ComboBox控件还不够,因为我不知道用户对这个控件做了哪些操作,是弹出下拉列表?还是收起下拉列表?或者选择了另一个项?
而我们这里要做的是,看用户选择了哪个视图,我们的ListView控件就显示哪种视图,显然,在通知码中,我们是对CBN_SELCHANGE感兴趣,因为选择的索引值一旦改变,就会收到这个通知码。
case IDC_CBVIEW:if (HIWORD(wParam) == CBN_SELCHANGE){// 当前选择项的索引int index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);// 根据选择设置视图DWORD lvView;switch (index){case 0:lvView = LV_VIEW_ICON;break;case 1:lvView = LV_VIEW_SMALLICON;break;case 2:lvView = LV_VIEW_LIST;break;case 3:lvView = LV_VIEW_DETAILS;break;default:lvView = LV_VIEW_DETAILS;break;}ListView_SetView(GetDlgItem(hDlg, IDC_LV), lvView);}break;}
发送CB_GETCURSEL消息,可以得到ComboBox中当前选定项的索引值。
四、向ListView添加图标
先用ImageList_Create创建图像列表,然后用ImageList_AddIcon宏向列表中添加图标。因为我们要用大图标和小图标,所以要创建两个图像列表,一个放置大图标,另一种放置小图标,因为同一个Image List中放置的所有图像的尺寸必须相同。
// 初始化ImageListhImgListSm = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_MASK,1,0);hImgListLg = ImageList_Create(GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),ILC_MASK,1,0);hicon = LoadIcon(hgAppInst,MAKEINTRESOURCE(IDI_ITE));// 添加图标ImageList_AddIcon(hImgListSm, hicon);ImageList_AddIcon(hImgListLg, hicon);DestroyIcon(hicon);
接着,用ListView_SetImageList把Image List和ListView关联起来。
// 将ListView与ImageList关联ListView_SetImageList(hListview, hImgListLg, LVSIL_NORMAL);ListView_SetImageList(hListview, hImgListSm, LVSIL_SMALL);
在向ListView添加项时,设置LVITEM结构体的iImage字段为图像列表中对应图像的索引,因为我们只添加了一个图标,所以,索引是0.
LVITEM vitem;vitem.mask = LVIF_TEXT | LVIF_IMAGE;vitem.iImage = 0;
ImageList_Create返回的是一个句柄,它也是一种资源,所以,在不需要它了,就得记得把它销毁。在我们的对话框发生WM_DESTROY的同时将其销毁。
case WM_SYSCOMMAND:if (wParam == SC_CLOSE){// 销毁ImageListImageList_Destroy(hImgListLg);ImageList_Destroy(hImgListSm);DestroyWindow(hListview);//不再需要DestroyWindow(hDlg);}return 0;
另外,补充一个小知识,要得到对话框中某个控件的句柄,可以调用GetDlgItem函数,这也是我们为什么要为控件设置ID值的原因。
程序运行后,就可以通过选择下拉列表来动态改变ListView的视图了。
好了,要过年了,这是新年前最后一篇博文,过完年后,我们继续。我也希望,后续能与大家一起分享更多的知识和编程技巧。
===================================
祝大家
新春快乐,生活愉快,身体健康,工作顺利,明年更有成就。
祝各位以及各位的亲朋好友们,新年快乐。
- 跟我一起玩Win32开发(16):ListView的多个视图
- 跟我一起玩Win32开发(15):ListView控件
- 跟我一起玩Win32开发(4):创建菜单
- 跟我一起玩Win32开发(7):多边形窗口
- 跟我一起玩Win32开发(13):握手对话框
- 跟我一起玩Win32开发(20):浏览文件夹
- 跟我一起玩Win32开发(22):抓取屏幕
- 跟我一起玩Win32开发(24):计时器
- 跟我一起玩Win32开发(25):监视剪贴板
- 跟我一起玩Win32开发(25):监视剪贴板
- 跟我一起玩Win32开发(2):完整的开发流程
- 跟我一起玩Win32开发(2):完整的开发流程
- 跟我一起玩Win32开发(1):关于C++的几个要点
- 跟我一起玩Win32开发(3):窗口的重绘
- 跟我一起玩Win32开发(5):具有单选标记的菜单
- 跟我一起玩Win32开发(18):使用对话框的两个技巧
- 跟我一起玩Win32开发(1):关于C++的几个要点
- 跟我一起玩Win32开发(1):关于C++的几个要点
- centos的twitter storm安装和storm-start的本地运行
- 安装TFS2012 server时候注意事项
- linux中删除软件(或命令)
- SHH框架整合详细步骤
- RAID0+1
- 跟我一起玩Win32开发(16):ListView的多个视图
- 云计算平台管理的三大利器Nagios、Ganglia和Splunk
- redhat enterprise linux 6.1 升级 firefox
- github常用指令
- php中GD实现扇形统计图
- 使用git/github管理ios项目 个人总结
- Using Content Security Policy to Prevent Cross-Site Scripting (XSS)
- 为Hadoop的namenode做NFS灾备步骤
- 一个实例让你真正懂得for循环