当前位置: 首页 > article >正文

还在用老方法显示数据?手把手教你用MFC的CListCtrl打造一个带图标的学生信息查询系统

实战MFC用CListCtrl构建可视化学生管理系统在桌面应用开发领域数据展示一直是用户体验的核心环节。传统的表格控件虽然能完成基本功能但缺乏视觉层次和交互灵活性。MFC中的CListCtrl控件提供了四种视图模式特别适合需要同时呈现图标和结构化数据的场景。本文将带你从零构建一个完整的学生信息管理系统重点解决图标适配、视图切换和控件联动等实际问题。1. 环境准备与基础配置1.1 创建MFC对话框项目使用Visual Studio新建MFC对话框项目命名为StudentInfoSystem。在资源视图中打开主对话框删除默认控件添加以下元素两个CListCtrl控件ID分别设置为IDC_LIST_STUDENTS和IDC_LIST_DETAILS两个按钮控件查询IDC_BTN_QUERY清空IDC_BTN_CLEAR一个静态文本控件作为标题// 对话框类声明 class CStudentInfoDlg : public CDialogEx { CImageList m_imgListLarge; CImageList m_imgListSmall; CListCtrl* m_pListStudents; CListCtrl* m_pListDetails; CString m_strSelectedID; }1.2 准备图标资源创建7个32x32和16x16的学生头像图标IDI_STUDENT1到IDI_STUDENT7建议使用透明背景PNG格式。在资源文件中添加如下定义IDI_STUDENT1 ICON res\\student1.ico IDI_STUDENT2 ICON res\\student2.ico ...2. 初始化列表控件2.1 配置图像列表在OnInitDialog()中初始化两种尺寸的图像列表// 大图标列表(32x32) m_imgListLarge.Create(32, 32, ILC_COLOR32 | ILC_MASK, 7, 1); // 小图标列表(16x16) m_imgListSmall.Create(16, 16, ILC_COLOR32 | ILC_MASK, 7, 1); for(int i0; i7; i) { HICON hIcon AfxGetApp()-LoadIcon(IDI_STUDENT1i); m_imgListLarge.Add(hIcon); m_imgListSmall.Add(hIcon); DestroyIcon(hIcon); }2.2 设置学生列表视图配置左侧列表为图标视图显示学生基本信息m_pListStudents (CListCtrl*)GetDlgItem(IDC_LIST_STUDENTS); m_pListStudents-SetImageList(m_imgListLarge, LVSIL_NORMAL); m_pListStudents-SetExtendedStyle(LVS_EX_BORDERSELECT); // 添加测试数据 CString strID; for(int i0; i7; i) { strID.Format(_T(S%04d), 1000i); m_pListStudents-InsertItem(i, strID, i); }2.3 配置详细信息报表视图右侧列表采用报表视图展示完整信息m_pListDetails (CListCtrl*)GetDlgItem(IDC_LIST_DETAILS); m_pListDetails-SetImageList(m_imgListSmall, LVSIL_SMALL); m_pListDetails-SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 添加列 static struct { LPCTSTR name; int width; } columns[] { {_T(学号), 80}, {_T(姓名), 100}, {_T(班级), 120}, {_T(入学日期), 100}, {_T(联系方式), 150} }; for(int i0; i_countof(columns); i) { m_pListDetails-InsertColumn(i, columns[i].name, LVCFMT_LEFT, columns[i].width); }3. 实现核心交互逻辑3.1 学生选择事件处理为左侧列表添加NM_CLICK消息处理void CStudentInfoDlg::OnClickListStudents(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMIA reinterpret_castLPNMITEMACTIVATE(pNMHDR); int nItem pNMIA-iItem; if(nItem 0) { m_strSelectedID m_pListStudents-GetItemText(nItem, 0); GetDlgItem(IDC_BTN_QUERY)-EnableWindow(TRUE); } *pResult 0; }3.2 查询按钮实现点击查询按钮时根据选择显示详细信息void CStudentInfoDlg::OnBnClickedQuery() { if(m_strSelectedID.IsEmpty()) return; // 清空现有数据 m_pListDetails-DeleteAllItems(); // 模拟数据库查询 CString strName, strClass, strDate, strPhone; int nID _ttoi(m_strSelectedID.Mid(1)); switch(nID % 7) { case 0: strName _T(张三); strClass _T(计算机2020-1班); break; // 其他case分支... } // 添加新记录 int nIndex m_pListDetails-InsertItem(0, m_strSelectedID, nID % 7); m_pListDetails-SetItemText(nIndex, 1, strName); m_pListDetails-SetItemText(nIndex, 2, strClass); m_pListDetails-SetItemText(nIndex, 3, _T(2020-09-01)); m_pListDetails-SetItemText(nIndex, 4, _T(13800138000)); }3.3 清空功能实现清空按钮的事件处理void CStudentInfoDlg::OnBnClickedClear() { m_pListDetails-DeleteAllItems(); m_strSelectedID.Empty(); GetDlgItem(IDC_BTN_QUERY)-EnableWindow(FALSE); }4. 高级功能扩展4.1 实现视图动态切换添加菜单或按钮允许用户切换显示模式void CStudentInfoDlg::SwitchViewMode(int nMode) { DWORD dwStyle m_pListStudents-GetStyle(); dwStyle ~LVS_TYPEMASK; switch(nMode) { case 0: dwStyle | LVS_ICON; break; case 1: dwStyle | LVS_SMALLICON; break; case 2: dwStyle | LVS_LIST; break; case 3: dwStyle | LVS_REPORT; break; } m_pListStudents-ModifyStyle(LVS_TYPEMASK, dwStyle); // 切换图像列表 m_pListStudents-SetImageList( (nMode 2) ? m_imgListLarge : m_imgListSmall, LVSIL_NORMAL); }4.2 添加排序功能实现按列排序的比较函数static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CListCtrl* pList (CListCtrl*)lParamSort; CString strItem1 pList-GetItemText(lParam1, 0); CString strItem2 pList-GetItemText(lParam2, 0); return strItem1.Compare(strItem2); } void CStudentInfoDlg::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pNMLV reinterpret_castLPNMLISTVIEW(pNMHDR); m_pListDetails-SortItems(CompareFunc, (DWORD_PTR)m_pListDetails); *pResult 0; }4.3 优化显示效果添加自定义绘制处理改善视觉效果void CStudentInfoDlg::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCD reinterpret_castNMLVCUSTOMDRAW*(pNMHDR); switch(pLVCD-nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: if(pLVCD-nmcd.dwItemSpec % 2 0) { pLVCD-clrTextBk RGB(240, 240, 255); } *pResult CDRF_DODEFAULT; break; } }5. 项目实战技巧5.1 处理大量数据当数据量较大时使用虚拟列表技术// 在初始化时设置 m_pListDetails-SetItemCount(10000); m_pListDetails-SetCallbackMask(LVIF_TEXT | LVIF_IMAGE); // 处理LVN_GETDISPINFO消息 void CStudentInfoDlg::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) { NMLVDISPINFO* pDispInfo reinterpret_castNMLVDISPINFO*(pNMHDR); if(pDispInfo-item.mask LVIF_TEXT) { switch(pDispInfo-item.iSubItem) { case 0: _stprintf_s(pDispInfo-item.pszText, pDispInfo-item.cchTextMax, _T(S%04d), pDispInfo-item.iItem 1000); break; // 其他列处理... } } }5.2 添加右键菜单实现列表项的上下文菜单void CStudentInfoDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if(pWnd-GetDlgCtrlID() IDC_LIST_DETAILS) { CMenu menu; menu.LoadMenu(IDR_DETAIL_MENU); CMenu* pPopup menu.GetSubMenu(0); pPopup-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); } }5.3 数据持久化添加导出到CSV文件功能void CStudentInfoDlg::ExportToCSV(LPCTSTR lpszFileName) { CStdioFile file; if(file.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite)) { // 写入列标题 CString strLine; for(int i0; im_pListDetails-GetHeaderCtrl()-GetItemCount(); i) { TCHAR szText[256]; HDITEM hdi {HDI_TEXT, 0, szText, 256}; m_pListDetails-GetHeaderCtrl()-GetItem(i, hdi); strLine szText; strLine (i m_pListDetails-GetHeaderCtrl()-GetItemCount()-1) ? _T(,) : _T(\n); } file.WriteString(strLine); // 写入数据行 for(int i0; im_pListDetails-GetItemCount(); i) { strLine.Empty(); for(int j0; jm_pListDetails-GetHeaderCtrl()-GetItemCount(); j) { strLine m_pListDetails-GetItemText(i, j); strLine (j m_pListDetails-GetHeaderCtrl()-GetItemCount()-1) ? _T(,) : _T(\n); } file.WriteString(strLine); } } }

相关文章:

还在用老方法显示数据?手把手教你用MFC的CListCtrl打造一个带图标的学生信息查询系统

实战MFC:用CListCtrl构建可视化学生管理系统 在桌面应用开发领域,数据展示一直是用户体验的核心环节。传统的表格控件虽然能完成基本功能,但缺乏视觉层次和交互灵活性。MFC中的CListCtrl控件提供了四种视图模式,特别适合需要同时呈…...

从零搭建PointRCNN:Linux环境配置与3D检测可视化实战

1. 环境准备:从零搭建Linux深度学习工作站 第一次在Linux系统上配置深度学习环境时,我盯着命令行界面手足无措的样子还历历在目。现在回想起来,其实只要掌握几个关键步骤,就能快速搭建好PointRCNN所需的运行环境。我们以配备NVIDI…...

Claude Code 愚人节彩蛋:终端里的虚拟宠物伴侣

Claude Code 愚人节彩蛋:终端里的虚拟宠物伴侣 在 AI 编程助手的深处,藏着一个等待孵化的秘密——18 种 ASCII 精灵、5 级稀有度、完整的 RPG 属性系统。这可能是你见过的最可爱的命令行宠物。 意外的发现 在逆向分析 Claude Code 源码的过程中&#xf…...

如何通过Nucleus Co-Op实现创新无缝的本地多人游戏体验

如何通过Nucleus Co-Op实现创新无缝的本地多人游戏体验 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经希望在同一台电脑上与朋友共同体…...

Windows下WVP+ZLMediaKit联动实战:5分钟搞定GB28181摄像头接入(附端口避坑清单)

Windows下WVPZLMediaKit联动实战:5分钟搞定GB28181摄像头接入(附端口避坑清单) 在智能视频监控领域,GB28181协议作为国家标准协议,正在成为设备互联的主流选择。但对于刚接触这一领域的开发者来说,从零开始…...

ZGC在超大堆(>16TB)下的隐性崩溃风险:JDK17~21版本兼容性断层分析(仅限内测团队知晓)

第一章:ZGC在超大堆(>16TB)下的隐性崩溃风险:JDK17~21版本兼容性断层分析(仅限内测团队知晓)当堆内存突破16TB阈值后,ZGC在JDK17至JDK21的多个GA版本中暴露出未公开的元数据结构越界行为——…...

Qwen3-0.6B-FP8与STM32开发联动:生成嵌入式系统控制逻辑伪代码

Qwen3-0.6B-FP8与STM32开发联动:生成嵌入式系统控制逻辑伪代码 1. 引言 如果你是一位嵌入式开发者,或者正在学习STM32,下面这个场景你一定不陌生:拿到一个传感器模块,比如温湿度传感器,想用它来控制一个风…...

Labelme标注实战:5分钟搞定语义分割数据集制作(附避坑指南)

Labelme标注实战:5分钟搞定语义分割数据集制作(附避坑指南) 当你第一次接触计算机视觉项目时,可能会被海量的标注需求吓到。别担心,今天我要分享的是如何用Labelme这个轻量级工具,快速完成语义分割数据标注…...

HY-MT1.5-1.8B功能体验:格式保留翻译,完美处理srt字幕和网页标签

HY-MT1.5-1.8B功能体验:格式保留翻译,完美处理srt字幕和网页标签 1. 引言:翻译模型的新挑战 在全球化内容爆炸式增长的今天,传统翻译工具面临两大核心痛点: 格式丢失问题:翻译srt字幕、HTML网页等内容时…...

Web Scraper插件实战:解决豆瓣电影Top250爬取乱序问题(附完整JSON配置)

Web Scraper插件实战:解决豆瓣电影Top250爬取乱序问题(附完整JSON配置) 当你第一次使用Web Scraper爬取豆瓣电影Top250榜单时,可能会遇到一个令人困惑的现象:明明页面上电影名称和简介是对应的,但爬取下来的…...

Z-Image-Turbo模型在智能车领域的应用:仿真场景图像生成

Z-Image-Turbo模型在智能车领域的应用:仿真场景图像生成 最近和几个做自动驾驶算法的朋友聊天,他们都在为一个问题头疼:测试数据不够用。特别是那些罕见的极端场景,比如暴雨天、浓雾夜,或者刺眼的逆光路况&#xff0c…...

大数据领域 OLAP 技术的发展趋势展望

大数据领域OLAP技术的发展趋势展望 关键词:OLAP、大数据分析、实时决策、云原生、AI融合 摘要:本文从超市老板的"销售密码"故事出发,用通俗易懂的语言拆解OLAP(在线分析处理)技术的核心逻辑,结合当前大数据技术演进趋势,深入探讨OLAP在实时化、云原生化、AI融…...

AI头像生成器开发者必备:GitHub项目管理核心技巧详解

AI头像生成器开发者必备:GitHub项目管理核心技巧详解 1. 引言:为什么GitHub对AI头像生成器项目至关重要 开发一个AI头像生成器项目时,你是否遇到过这些挑战:团队成员同时修改同一文件导致冲突、新功能上线后出现意外bug却无法快速…...

AI辅助前端设计:让快马平台生成酷炫的滚动视差与3D交互效果代码

AI辅助前端设计:让快马平台生成酷炫的滚动视差与3D交互效果代码 最近在做一个科技公司的产品介绍页,想实现一些炫酷的交互效果来提升用户体验。传统方式需要手动编写大量CSS和JavaScript代码,调试起来也很耗时。不过现在有了AI辅助开发工具&…...

美国智能手机搜查法律现状:不确定性与风险并存

生物识别解锁:法律模糊地带的高风险在美国,配置生物识别解锁功能的设备一直面临易受攻击的问题。目前,关于手机搜查的合法权益并不明确。一方面,若手机设置密码锁,被拘留或逮捕时说出密码可能被视为自证其罪&#xff0…...

RTX 4090专属SDXL 1.0绘图工坊实测:一键生成电影质感图片,效果惊艳

RTX 4090专属SDXL 1.0绘图工坊实测:一键生成电影质感图片,效果惊艳 1. 开箱体验:当顶级显卡遇上专业绘图模型 拿到这台搭载RTX 4090显卡的工作站时,我就迫不及待地想测试它的AI绘图能力。SDXL 1.0作为Stable Diffusion系列的最新…...

优盈杯数据泄露事件复盘:隐私保护的警钟

300 万张照片泄露:优盈杯隐私防线的崩塌2014 年 9 月,Clarifai 公司首席执行官向优盈杯一位创始人发邮件,请求提供大量优盈杯照片数据集。由于优盈杯部分创始人对 Clarifai 有投资,Humor Rainbow 为其提供了近 300 万张 优盈杯用户…...

GitHub资源精准下载:DownGit实现90%带宽节省的技术方案

GitHub资源精准下载:DownGit实现90%带宽节省的技术方案 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 在开源开发流程中,开发者经常需要从GitHub仓库获取特定文件夹资源。传统方式下&…...

Proteus仿真实战:基于STM32的智能环境感知与联动控制系统(附源码)

1. 项目背景与核心功能 想象一下这样的场景:当你走进书房时,灯光自动亮起;当室内温度过高时,空调自动开启;当光线不足时,窗帘缓缓拉开。这些看似科幻的场景,其实用STM32单片机和Proteus仿真就能…...

3个跨设备游戏自由:Sunshine如何用开源技术打造无缝串流体验

3个跨设备游戏自由:Sunshine如何用开源技术打造无缝串流体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在数字娱乐多元化的今天,游戏玩家常面临高性能…...

AudioLDM-S极速音效生成:5分钟搞定游戏音效,小白也能当音效师

AudioLDM-S极速音效生成:5分钟搞定游戏音效,小白也能当音效师 1. 游戏音效制作的新纪元 想象一下这样的场景:你正在开发一款独立游戏,需要一个"科幻飞船引擎启动"的音效。传统方式可能需要花费数小时搜索音效库、购买…...

springboot+vue基于web的个人博客论坛交流网站

目录同行可拿货,招校园代理 ,本人源头供货商核心功能模块分析技术实现要点扩展功能设计安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 核心功能模块分析 用户管理模块 注…...

Awoo Installer深度解析:破解Switch游戏安装困境的全能工具

Awoo Installer深度解析:破解Switch游戏安装困境的全能工具 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 在Nintendo Switch破解社区…...

DLSS状态指示器配置完全指南:实用监控工具深度解析

DLSS状态指示器配置完全指南:实用监控工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的路上,你是否曾疑惑DLSS是否真正生效?DLSS Swapper作为一款专…...

永磁同步直线电机建模、仿真及优化教学:从基础原理入门到工程应用精通的系统学习与实战指南

永磁同步直线电机,建模,仿真及优化教学从入门到精通永磁同步直线电机高速精密绘图仪笔尖能在纸上跑出米每秒级速度却连发丝粗细的误差都没有,晶圆台托着指甲盖大的芯片在光刻机里微米级挪位卡得死死的,这些“直来直去还准到离谱”…...

Simulink新手必看:从零搭建四轴飞行器仿真模型(附完整代码)

Simulink实战:四轴飞行器仿真建模全流程解析 四轴飞行器作为无人机领域的经典构型,其控制系统的设计与验证一直是工程师和科研人员的重点课题。对于刚接触Simulink的开发者而言,如何将复杂的飞行动力学转化为可视化的仿真模型往往令人望而生畏…...

小爱音箱音乐自由播放器:解锁无限听歌体验的完整指南

小爱音箱音乐自由播放器:解锁无限听歌体验的完整指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否厌倦了音乐平台的各种限制?是否想…...

零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南

零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...

UE5新手避坑:用C++实现关卡切换和字符串处理,别再复制粘贴了

UE5 C实战避坑指南:关卡切换与字符串处理的高效实践 刚接触UE5 C开发的程序员们,是否经常遇到关卡切换不生效、字符串比较结果诡异、GetAllActorsOfClass导致性能骤降等问题?本文将深入剖析这些典型陷阱,带你从底层机制理解正确做…...

忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南

忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南 1. 认识忍者像素绘卷 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,它将忍者的热血意志与16-Bit复古游戏美学完美融合。这款工具采用明亮的"云端"视觉设计,…...