首页 > 代码库 > 【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控件节点的增删改查