首页 > 代码库 > 【mfc】学生信息管理,实现List控件节点的增删改查

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

之前在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封装好了,无须写代码,把原来的“取消”按钮改个名字就行了。这样编译运行,整个程序做完。虽然整个程序的步骤非常之多,非常的复杂,但做熟练之后就变得易如反掌。

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