【mfc】学生信息管理,实现List控件节点的增删改查

2023-10-31

之前在mfc这个专栏里面,写了很多关于win32的程序,

其实也没什么的,win32是mfc的基础,

mfc只是win32的扩展,系统自带的扩展,新建一个mfc如同新建一个win32程序,不过这个win32程序一开始就带了很多空函数框架。


一、基本目标

要建立如下图所示的学生信息管理mfc程序,当然这个程序以后应该考虑连接数据库,access,sql server都可以,

同时连同《【mfc】用对话框分页实现用户登录》(点击打开链接),让用户登录之后才能够管理信息,当然这是后话。

1、这个程序,在学号、姓名、班级的编辑框中输入完信息,点击“添加”按钮,会把信息插入到List控件之中


2、如果没有选择任意一个节点,点击“修改”按钮会提示用户选择其中的项才能修改List的节点信息,用户选择完其中的一个节点,询问用户是否要修改,如果否,则不会发生任何事情,如果是,那么把当前编辑框中的学号、姓名、班级替换这个节点


3、删除按钮,也是需要用户先选择一个节点,才能删除,否则会弹出提示。删除前同样弹出对话框作询问,这里询问对话框与修改的不同,会带有当前选择节点的信息


4、关闭按钮则顾名思义,关闭当前的窗口



二、制作过程

1、在VC6选择文件->新建..,在弹出的窗口中选择MFC AppWizard(exe),输入工程名称,选择保存位置,点击确认



2、接着并不是像控制台程序那样直接新建的,在向导的第一步,选择“基本对话框”应用程序类型,再点下一步



3、在向导的第二步,把所有的复选框都变成unchecked,不要选择任何一个,对话框的标题这里可以先不管,在之后的控件编辑可以改,没关系的,现在改也可以,记得把所有勾去掉才点下一步



4、向导的最后一步,把“你希望使用MFC库吗?”改成“作为静态的DLL”就可以点“完成”了



5、之后就直接来到与Win32程序一模一样的控件编辑界面,这里唯一一点不同是设置控件属性,不像Win32程序那样双击,而是要右击控件,选择属性,才能改,双击属性这里是增加新的成员函数。不熟悉Win32程序界面编辑的可以参考我之前的《【mfc】基本对话框程序——加法器》(点击打开链接



6、一开始系统会自带“确定”与“取消”按钮,按Delete键删除“确定”按钮,把“取消”按钮保留,拉到右下角,把其Caption改成“关闭”,这里的“关闭”不用像《【mfc】基本对话框程序——加法器》(点击打开链接)里面的WIN32程序那样为这个按钮写代码,MFC已经对这个“取消”按钮封装好了,点击即关闭。之后拖入3个Button控件,其于控件工具栏的位置就在编辑框EditField下面,将其改名为“添加”、“修改”、“删除”,用下方的对齐工具将他们排好版。List控件的位置如图所示,将其属性中的样式页中的查看改为“报告”,“单个选择”勾上。



7、然后把整个大的对话框的Caption改成“学生管理系统”,在最上方拉入“学号”等编辑框与静态文本,整体如下图所示,为了使程序美观,请用下方的对齐工具布局好。最后双击3个按钮,为其添加成员函数。成员函数的名字默认就行,不用改名。你改名也没有,个人喜欢。然后像Win32程序那样,切到ClassView中开始写代码。



8、ClassView中如下图所示,由于这里使用MFC,而不是简单的WIN32程序,因此这里一开始就存在着许多函数。由于我的工程名字为Stumanager,所以会自动产生CStumanagerApp.h,CStumanagerAPP.cpp,CStumanagerDlg.h,CStumanagerDlg.cpp等4个文件,分为两大程序,里面有很多类,这里暂时就无须考虑。我们只需要关注CxxxDlg中的OnInitDialog(),与刚才创建的三个成员函数OnButton1(),OnButton2(),OnButton3(),xxx即工程名称,我这里是Stumanager。



9、OnInitDialog()是程序一加载的函数,它里面本来就有东西的,因为需要要为程序加载图标,加载对话框等,我们点击ClassView中的OnInitDialog(),不要动里面本来就存在的东西,在// TODO: Add extra initialization here之后,return TRUE;  // return TRUE  unless you set the focus to a control之前写入代码。我们要初始化那个List控件,在里面加载学生、姓名、班级等列。因此OnInitDialog()的代码被改造如下:

BOOL CStumanagerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	//这是获取操纵List控件IDC_LIST1的指针
	CListCtrl *pList=(CListCtrl *)GetDlgItem(IDC_LIST1);
	//插入一个列,学号,左对齐,宽度为100,之后如此类推,就是List控件里面的标题栏
	pList->InsertColumn(0,"学号",LVCFMT_LEFT,100);
	pList->InsertColumn(1,"姓名",LVCFMT_LEFT,100);
	pList->InsertColumn(2,"班级",LVCFMT_LEFT,100);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

10、点击ClassView中的OnButton1(),我们自己创建的成员函数,也就是点击“添加”按钮之后触发的动作,成员函数一开始是没有东西的

void CStumanagerDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	//这是获取操纵List控件IDC_LIST1的指针
	CListCtrl *pList=(CListCtrl *)GetDlgItem(IDC_LIST1);
	//这里是求出现在List控件里面有多少项,为了我们要插入到末尾,找到现时末尾的那个位置是多少
	//比如现在有3列,那么我们就应该在第3列插入
	int nCount=pList->GetItemCount();
	//此乃WIN32字符串,为了配合下面的GetDlgItemText的函数
	CString str;
	//把编辑框IDC_EDIT1,也就是“学号”中的内容,仍到这个字符串,之后拆入到最后一行,其他如此类推
	GetDlgItemText(IDC_EDIT1,str);
	pList->InsertItem(nCount,str);
	GetDlgItemText(IDC_EDIT2,str);
	pList->SetItemText(nCount,1,str);
	GetDlgItemText(IDC_EDIT3,str);
	pList->SetItemText(nCount,2,str);
}

这里注意,插入第一项用InsertItem,之后就应该统一用SetItemText,因为插入的原理是,新建一列,放入第0项之后,后面统一设置为空,下面的工作是把后面的空项修改为你想要的数值,使用户看起来是一起插入的。


11、点击ClassView中的OnButton2(),为“修改”按钮写之后触发的动作

void CStumanagerDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	//这是获取操纵List控件IDC_LIST1的指针
	CListCtrl *pList=(CListCtrl *)GetDlgItem(IDC_LIST1);
	//这里是获取选择的位置,如果没有任何选择,这两行的函数最后求出来的nSel为-1,如果选择了,则nSel为现在选择的行数
	POSITION pos=pList->GetFirstSelectedItemPosition();
	int nSel=pList->GetNextSelectedItem(pos);
	if(nSel<0)
		//没有选到任何东西,就弹窗,AfxMessageBox是MFC中的函数,同样可以使用Win32的MessageBox弹窗,
		//这里仅有两个参数,不能想MessageBox那样设置弹窗的标题,默认为我们的工程名,但好处是不用写句柄是谁
		AfxMessageBox("请选中要修改的项!",MB_OK);
	else{
		//选择东西,弹出窗选择用户,AfxMessageBox得到IDYES的值,也就是用户按“是”才进行下面的修改代码
		if(AfxMessageBox("确认修改?",MB_YESNO)==IDYES){
			CString str;
			GetDlgItemText(IDC_EDIT1,str);
			//把现时IDC_EDIT1也就是“学号”编辑框的值替换掉选择那行的第0项,然后如此类推,这就完成修改
			pList->SetItemText(nSel,0,str);
			GetDlgItemText(IDC_EDIT2,str);
			pList->SetItemText(nSel,1,str);
			GetDlgItemText(IDC_EDIT3,str);
			pList->SetItemText(nSel,2,str);
		}
	}
}

12、点击ClassView中的OnButton3(),为“删除”按钮写之后触发的动作

“删除”按钮触发的动作,实质上与“修改”按钮逻辑类似

void CStumanagerDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	//这是获取操纵List控件IDC_LIST1的指针
	CListCtrl *pList=(CListCtrl *)GetDlgItem(IDC_LIST1);
	//这里是获取选择的位置,如果没有任何选择,这两行的函数最后求出来的nSel为-1,如果选择了,则nSel为现在选择的行数
	POSITION pos=pList->GetFirstSelectedItemPosition();
	int nSel=pList->GetNextSelectedItem(pos);
	if(nSel<0)
		AfxMessageBox("请选中要删除的项!",MB_OK);
	else{
		//这里的if中,通过GetItemText获取现在被选择行的信息,得到用户的确定之后,删除所选行。
		if(AfxMessageBox("确认删除:\n学号为:"+pList->GetItemText(nSel,0)+"\n姓名为:"+pList->GetItemText(nSel,1)+"\n班级为:"+pList->GetItemText(nSel,2)+"\n的学生吗?",MB_YESNO)==IDYES)
			pList->DeleteItem(nSel);
	}
}

由于“关闭”按钮已经被MFC封装好了,无须写代码,把原来的“取消”按钮改个名字就行了。这样编译运行,整个程序做完。虽然整个程序的步骤非常之多,非常的复杂,但做熟练之后就变得易如反掌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【mfc】学生信息管理,实现List控件节点的增删改查 的相关文章

随机推荐

  • Xpath的使用

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 若身在泥潭 心也在泥潭 则满眼望去均是泥潭 若身在泥潭 而心系鲲鹏 则能见九万里天地 文章目录 XPat
  • 【软件测试】大厂测工都是这样学习的,你get到了吗?

    有不少的软件测试工程师站在 十字路口 迷茫 无助 找不到自己的方向 一切的迷茫都是因为想得太多而做的太少 每位软件测试行业从业者都能意识到目前自己面临的窘境 但能及时作出改变 顺应时代变化的人还是太少 多数人明明 泰山崩于前而面色如土 却只
  • 【番杰的小技巧笔记】如何通过嘉立创免费打印立创EDA设计的PCB

    引言 嘉立创从今年 2022 八月开始 就不能免费打印其他软件设计的PCB 一次消费20以上可以 所以我来说下如何在嘉立创上免费打印立创EDA设计的PCB 1 下单步骤 1 1 下载 嘉立创下单小助手 想要免费打印 就得先下载 嘉立创下单小
  • xps数据怎么导出为txt_如何处理XPS原始数据

    盼了好久 终于盼来了XPS的分峰拟合教程 拿到XPS的实验结果 首先我们要会看XPS高分辨谱原始数据 XPS高分辨谱的原始数据一般为 xls 文件 打开该文件 我们可以看到各种特定元素的高分辨谱及对它们进行半定量分析的原始数据 如下图 记住
  • 数据结构——线性表

    目录 2 1线性表的定义和特点 2 2案例引入 2 3线性的类型定义 基本操作 一 基本操作 二 基本操作 三 基本操作 四 基本操作 五 2 4线性表的顺序表示和实现 线性表的顺序存储结构占用一片连续的存储空间 顺序表中元素存储位置的计算
  • 微服务容器化实践——微服务设计拆分方法论

    文章目录 微服务设计原则 垂直划分优先原则 持续演进原则 服务自治 接口隔离原则 自动化驱动原则 微服务划分方法 基于数据驱动划分服务 基于领域驱动划分服务 从已有单体架构中逐步划分服务 就像很难用一个绝对的方式去判断架构的好坏一样 在大多
  • IDEA配置方法注释

    IDEA类和方法注释模板设置 非常详细 百度文库 一 设置类的注释模板 1 选择File Settings Editor File and Code Templates Files Class 可以看到创建Class时引入了一个参数 Fil
  • 微信授权网页扫码登录php,PHP实现微信开放平台扫码登录源码

    1 首先到微信开放平台申请https open weixin qq com 获取到appid和APPSECRET 前台显示页面如下html gt var obj new WxLogin id login container appid wx
  • 基于javaweb的音乐网站

    Springboot springmvc mybatis 数据库mysql 开发工具不限 前台 html css js 实现了注册 登陆 权限校验 上传歌曲 下载歌曲 播放歌曲 删除歌曲 个人歌单 后台 用户管理 mv上传 播放 歌曲新增
  • JVM安全点详解

    1 安全点是什么 在虚拟机在进行可达性分析时 HotSpot虚拟机会在特定的位置记录在哪有引用 这些特定的位置就叫做安全点 2 安全点的作用是什么 上边已经说过了 在Oomap的帮助下 HotSpot虚拟机很快就完成了GC Roots枚举
  • Java基础之——Stream 流、方法引用

    Stream 流 方法引用 1 Stream 流 1 1 引言 传统集合的多步遍历代码 几乎所有的集合 如 Collection 接口或 Map 接口等 都支持直接或间接的遍历操作 而当我们需要对集合中的元素进行操作的时候 除了必需的添加
  • 第八章 课后习题

    习题 一 填空题 1 在C 的输入输出系统中 最核心的对象是 流 执行输入和输出操作的类体系叫做 流类 2 当实际进I O操作时 cin与 标准输入 设备相关联 3 C 的流类库预定义了4个流 它们是 cin cout cerr 和 clo
  • 练手题 ——《应该被禁止的Leetflex账户》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • Kafka的安装是否成功的简单测试命令

    Kafka的安装是否成功的简单测试命令 首先了解一下kafka的基本概念 1 Broker Kafka集群包含一个或多个服务器 这种服务器被称为broker 2 Topic 每条发布到Kafka集群的消息都有一个类别 这个类别被称为Topi
  • 洛谷P1220 关路灯 (区间动态规划)

    https www luogu org problemnew show P1220 题解 对于从第i个点走到第j个点 肯定会将 i j 的路灯全部关闭 考虑关闭第i 1个点 现在可能有两种状态 关完 i j 之后位于i 或者位于j 所以设计
  • 【error】 Request method ‘GET‘ not supported app端调用后台接口报错,后台人员自己调用时没问题

    目录 问题描述 原因分析 解决方案 方法一 方法二 方法三 联系自身 问题描述 org springframework web HttpRequestMethodNotSupportedException Request method GE
  • TS 函数

    在 TS 中 要使用函数 要求必须约束函数参数和返回值的类型 一 基础语法 1 JS 中函数 函数声明式 function 函数名 参数 return 返回值 函数表达式 const 变量名 function 参数 return 返回值 2
  • 3个赚钱思路和案例,都是暴利赚钱项目,最后一个你肯定见到过

    3个赚钱思路和案例 最后一个你肯定见到过 赚钱思路1 浙江两兄弟在淘宝开一家 西京超市 不进货不配送 就是利用程序爬京东的单品页 顾客下单再到京东下单 京东的配送效率没的说 又是快消品 几个月就升到金冠 他们利用淘宝的流量和京东的物流服务积
  • linux设置http/https proxy及忽略proxy的方法

    一 场景 有些linux服务器处于内网 并且没有公网ip 故要想与外网进行http https通信只能通过nat或者加proxy的方式 nat服务器有网段的限制 而http https proxy代理则没有 使用起来也方便 但是 使用htt
  • 【mfc】学生信息管理,实现List控件节点的增删改查

    之前在mfc这个专栏里面 写了很多关于win32的程序 其实也没什么的 win32是mfc的基础 mfc只是win32的扩展 系统自带的扩展 新建一个mfc如同新建一个win32程序 不过这个win32程序一开始就带了很多空函数框架 一 基