MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

news/2024/11/23 3:29:08/

本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn、InsertItem、SetItemText向列表插入数据,CImageList插入BMP图片或ICON图标.

一.创建项目及界面

1.创建项目
   
创建项目名为"QQList"的基于MFC对话框的应用程序.资源视图中对话框IDD_QQLIST_DIALOG删除"TODE"和按钮,并添加List Control控件.

2.添加成员变量
    项目->类向导->类名为"CQQListDlg"->成员变量点击"IDC_LIST1"添加成员变量public(访问) CListCtrl(变量类型) m_list(变量名).同时添加成员变量CImageList m_imList调用其函数实现添加图片.

3.插入3张BMP图片
    右键"资源视图"中"Dialog"->选择"添加资源"->点击"Bitmap"->导入本地图片3张(工程文件res文件夹中).其ID分别为IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3.
注意:在加载图片时,已经使用画图把图片修改为64*64像素的24位彩色BMP图片,在后面对应的m_imList.Create(64,64,ILC_COLOR24,10,20)函数即加载它.倘若选择ILC_COLOR或32*32会出现几位黑白色或大小失真现象.

4.添加自定义函数
    在"类向导"中向CQQListDlg中添加方法void CQQListDlg::InsertPicAndWord(void)该函数即实现添加图片和文字功能.
其中QQListDlg.h中的代码如下图所示:

public://成员变量CListCtrl m_list;            // 列表控件 IDC_LIST1CImageList m_imList;         // 图像列表(相同大小图像集合)
public://成员函数void InsertPicAndWord(void); // 实现插入图片和文字

二.源代码

其中主代码void CQQListDlg::InsertPicAndWord(void)如下:

// 调用该函数实现向CListCtrl中加载图片和文字
void CQQListDlg::InsertPicAndWord(void)
{// 设置CListCtrl控件扩展风格:整行选中\绘制表格\子项目图标列表DWORD dwStyle; dwStyle = m_list.GetExtendedStyle();  dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES ;m_list.SetExtendedStyle(dwStyle);   // 载入64*64像素 24位真彩(ILC_COLOR24)图片m_imList.Create(64,64,ILC_COLOR24,10,20);    // 创建图像序列CImageList对象CBitmap * pBmp = NULL;pBmp = new CBitmap(); pBmp->LoadBitmapW(IDB_BITMAP1);              // 载入位图IDB_BITMAP1m_imList.Add(pBmp,RGB(0,0,0));  delete pBmp;  //pBmp = new CBitmap();  pBmp->LoadBitmapW(IDB_BITMAP2);  m_imList.Add(pBmp,RGB(0,0,0));  delete pBmp;//pBmp = new CBitmap();  pBmp->LoadBitmapW(IDB_BITMAP3);  m_imList.Add(pBmp,RGB(0,0,0));  delete pBmp;// 设置CImageList图像列表与CListCtrl控件关联 LVSIL_SMALL小图标列表m_list.SetImageList(&m_imList,LVSIL_SMALL);// 向列表视图控件InsertColumn插入3列数据 CRect mRect;m_list.GetWindowRect(&mRect);                     // 获取控件矩形区域int length = mRect.Width();m_list.InsertColumn(0, _T("用户头像"), LVCFMT_CENTER, length / 4, -1);m_list.InsertColumn(1, _T("用户名"), LVCFMT_CENTER, length / 4, -1);m_list.InsertColumn(2, _T("QQ格言"), LVCFMT_CENTER, length / 2, -1);// 添加数据 InsertItem向列表中插入主项数据 SetItemText向列表中的子项写入数据int nRow;                                        // 记录行号 LVITEM lvItem={0};                               // 列表视图控 LVITEM用于定义"项"的结构//第一行数据lvItem.mask = LVIF_IMAGE|LVIF_TEXT|LVIF_STATE;   // 文字、图片、状态lvItem.iItem = 0;                                // 行号(第一行)lvItem.iImage = 0;                               // 图片索引号(第一幅图片 IDB_BITMAP1)lvItem.iSubItem = 0;                             // 子列号nRow = m_list.InsertItem(&lvItem);               // 第一列为图片m_list.SetItemText(nRow,1,_T("dog"));            // 第二列为名字m_list.SetItemText(nRow,2,_T("人生在于奋斗"));     // 第三列为格言//第二行数据lvItem.mask = LVIF_IMAGE|LVIF_TEXT|LVIF_STATE;   // 文字、图片、状态lvItem.iItem = 1;                                // 行号(第二行)lvItem.iImage = 1;                               // 图片索引号(第二幅图片 IDB_BITMAP2)lvItem.iSubItem = 0;                             // 子列号nRow = m_list.InsertItem(&lvItem);     m_list.SetItemText(nRow,1,_T("cat"));  m_list.SetItemText(nRow,2,_T("快乐生活每一天"));  //第二行数据lvItem.mask = LVIF_IMAGE|LVIF_TEXT|LVIF_STATE;   // 文字、图片、状态lvItem.iItem = 2;                                // 行号(第三行)lvItem.iImage = 2;                               // 图片索引号(第三幅图片 IDB_BITMAP3)lvItem.iSubItem = 0;                             // 子列号nRow = m_list.InsertItem(&lvItem);      m_list.SetItemText(nRow,1,_T("pig"));   m_list.SetItemText(nRow,2,_T("Eastmount制作"));   
}

同时需要在初始化程序时调用该函数即可实现:

BOOL CQQListDlg::OnInitDialog()
{...// TODO: 在此添加额外的初始化代码InsertPicAndWord();      // 调用该函数实现加载图片和文字return TRUE;             // 除非将焦点设置到控件,否则返回 TRUE
}

注意:现在可能你运行后会遇到一个错误就是SetItemText、InsertColum加载的数据和图片不能显示.Why?
那是需要设置CListCtrl控件IDC_LIST1属性View为Report风格.ListCtrl有四种风格:
Icons(图标)使用32*32大小图标显示列表
Small Icons(小图标)使用16*16大小图标显示单一列表
List(列表)使用Small Icons,可有多列,第二列必须填充之前必须填充第一列,自上而下排序
Report(报表)编程者自定义的格式显示列表

如果程序中想要在加载ICON图标,则代码为:

HICON hIcon;  
m_imList.Create(32,32,ILC_COLOR24,10,20);  
hIcon = AfxGetApp()->LoadIconW(IDI_ICON_GREE);  
m_imList.Add(hIcon); 

程序运行结果:

希望文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.同时感谢文章资料的作者和向我提出该问题的那个同学.(By:Eastmount 2014-2-28 夜2点 原创:http://blog.csdn.net/eastmount)
下载源代码地址:http://download.csdn.net/detail/eastmount/6972035

参考资料及在线笔记:
(1).
ListCtrl控件,Report风格列表中添加图片 - ribut9225(主要讲述加载图片)
http://blog.csdn.net/ribut9225/article/details/6905165

(2).VC MFC列表视图(CListCtrl)控件 - 无尽的路(讲述CListCtrl加载图文字 附图)
http://hi.baidu.com/3582077/item/38858bb484e11477254b090a

(3).CListCtrl基础用法 - welkangm(详细讲述CListCtrl概述、加载数据 获取行号 删除行)
http://welkangm.blog.163.com/blog/static/190658510201232032336899/
(4).CListCtrl加载图片技术 - woshishushangdezhu(可参考加载动态路径下的图片F:\\)
http://blog.csdn.net/woshishushangdezhu/article/details/3938433
(5).如何更改CListCtrl每行的高度(可参考rwx_tech的回答设置行高度)
http://bbs.csdn.net/topics/60367436


http://www.ppmy.cn/news/903566.html

相关文章

【龙芯1B】:LCD显示图片文字背景色前景色、小创语音控制lcd显示、数码管倒计时

项目场景: 闲来无事,写了几个关于嵌入式技能大赛的任务。希望对大家有所帮助。本文开发板由百科荣创的龙芯1b开发板支持,关于嵌入式技能大赛的开发板。 LCD显示图片&文字&背景色&前景色小创语音控制lcd显示数码管倒计时 LCD显示图…

Led显示屏设备自发现技术实现-上海灵信

https://noodb.com/blog/1452283122107486209 Led显示屏设备自发现技术实现 目的: 实现一个设备管理中心,可以配置Led设备的IP地址和MASK地址等 语言: C# 设备: 上海灵信视觉X4系列 技术过程: 该设备官方文档…

html仿QQ资料卡,JS实现的模仿QQ头像资料卡显示与隐藏效果

本文实例讲述了JS实现的模仿QQ头像资料卡显示与隐藏效果。分享给大家供大家参考,具体如下: 我们使用QQ时经常需要查看朋友的资料卡,当我们把鼠标移入头像时,资料卡显示,并且鼠标能在头像与资料卡之间能随意移动&#x…

QQ第三方登录并获取显示头像

一、需要百度搜多友盟官方点击SDK下载 二点击进来会发现三个SDK 下载最后一个 三、按照路径找到这3个jar包并导入 四、按照路径分别把drawable、layout、values里面的文件复制到自己studio相对应的里面 五、导入依赖权限 compile com.umeng.sdk:common:latest.integrationcom…

Python:使用pandas对excel数据筛选选择

1.筛选方式1:直接筛选 #直接筛选 #DataFrame索引使用[], #直接索引语法:df[] 1.1 直接筛选,选择单列数据:df["列"] 1.2直接筛选,选择多列数据:df[["列1","列2"]](注意:多嵌套列) 1.3直接筛选,选择多行数据&…

2023.7.14 智慧芽前端面试总结

整体面试体验感蛮不错的,面试官很愿意与我交流,面试的结尾也给出了一定的学习建议。 由于这家公司主要的业务是做搜索引擎方面,估摸着是个自研。面试注重点主要是偏业务处理和针对工具的使用,还有无障碍阅读英文文章,…

实测:360极速浏览器在内存控制上完胜Edge

同样是开启7个同样的网页标签页:内存占用如下:

Edge 浏览器新版来袭,Office 功能首次出现!

‍ ‍微信搜索公众号“逆锋起笔”,选择“星标” 第一时间关注 程序员干货分享! 为了让用户快速访问Office文件,微软已经为Edge和Chrome浏览器提供了一个浏览器扩展。除此之外,近日微软Edge 92版开始向开发频道的测试人员推出&…