首先先改良一下上次在《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)中提到的一种方法:为了解决mfc模态对话框在任务栏中不显示的缺陷,于是在一些模态对话框中的OnInitDialog()初始化函数中,使用SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, WS_EX_APPWINDOW);这样虽然能够实现效果,但是在每一个模态对话框都要添加这句话那不是累死?其实如下图的解决方式:
打开新建mfc工程就创建的CxxApp类,把旗下的InitInstance()中的m_pMainWnd=&dlg;删掉或者注释掉,以后所有模态对话框都在原来对话框隐藏的时候,都会有标题了。这句话默认是存在的。它没有考虑到我们使用模态对话框的时候,会把这个主对话框隐藏掉所致。
这期,主要为大家带来在mfc如何实现不同对话框之间互相操控与全局变量的定义,还有日期控件的使用,继续上次在《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)中的工程,里面还有“学生管理”这个按钮没有做完,首先在CIsysDlg主对话框中添加Button3学生管理的消息映射函数,这个与以前的工程一样,甚至代码都一样,不讲了:
#include "InfoDlg.h" void CIsysDlg::OnButton3() { ShowWindow(SW_HIDE); CInfoDlg dlg; dlg.DoModal(); ShowWindow(SW_SHOW); }其中,一会儿我们画出来的对话框添加的类名就是CInfoDlg。
一、基本目标
实现下面的功能,学生信息管理,点击添加按钮会弹出一个模态对话框“添加信息”,里面有姓名、班级、出生日期,其中姓名是不允许相同的,然后,在“添加信息”对话框点击“添加”按钮,会把消息插入到“学生信息管理”对话框。“添加信息”对话框里面使用到了编辑框、下拉列表与日期控件,这个日期控件能够自己输入与选择。而在“学生信息管理”对话框,选中信息之后,点击“删除按钮”则能够删除信息。
二、制作过程
1、首先画出学生信息管理对话框,怎么添加在《【mfc】用对话框分页实现用户登录》(点击打开链接)讲过,里面包含四个按钮与列表控件,注意把这个列表控件设置成单选,自带的两个“确定”、“取消”按钮请自行删除,本期主要实现“添加”与“删除”按钮功能,为这个对话框添加类CInfoDlg,“打开”与“保存”留到之后再做,按钮的快捷键是如何添加、如何为对话框添加类,在《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)已经说过。
2、之后画出“添加信息”控件,这个对话框里面包含三个静态文本、一个编辑框,一个下拉列表,还有一个日期控件,为这个对话框添加CInfoApp类
3、日期控件如下图添加:
4、把这个日期控件的样式改成如下所示,格式是“长日期”,其他默认就行,你选择“使用旋转控件”也行,个人喜好吧,反正之后的代码没有不同,个人觉得默认的样式比较好看一点。日期控件默认就能够自己输入,也能够自己选择日期。
5、之后就开始写代码了,因为我们首先要“学生信息管理”对话框中的列表控件初始化,所以我们要为CInfoDlg添加初始化OnInitDialog()函数,同时我们为了不用每次操作这个列表都要声明一次CListCtrl* plist=(CListCtrl*)GetDlgItem(IDC_LIST1);然后用plist->方法去操作,因此,我们首先如下图在CInfoDlg头文件中加入一个CListCtrl*
‘
然后回到OnInitDialog()中使用一句m_List.SubclassDlgItem(IDC_LIST1,this);,以后在所有本对话框的所有函数,都能够用m_List去操控列表控件了。初始化列表控件的方法,与之前的《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)一样,只是不再是plist->去调用,而是m_List中的成员了。
BOOL CInfoDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //现在本对话框的头文件中登录一个CListCtrl m_List; //然后,利用此方法获取其某控件的ID就可以使用了 //不必每次都用声明的CListCtrl* plist=(CListCtrl*)GetDlgItem(IDC_LIST1);中的plist->方法去操作 m_List.SubclassDlgItem(IDC_LIST1,this); m_List.InsertColumn(0,"姓名",0,100); m_List.InsertColumn(1,"班级",0,100); //出生日期的列扩大一些 m_List.InsertColumn(2,"出生日期",0,200); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }出生日期那一列扩大一点,毕竟日期是比较大的
6、之后是“学生信息管理”对话框中的“添加”按钮的消息映射函数,这个按钮是弹出一个CInfoAddDlg的模态框的,为了在“添加”对话框中能够操作“学生信息管理”这个对话框中的控件,我们先要打开CInfoAddDlg.h进行如下图的操作
之后为“学生信息管理”对话框中的“添加”按钮添加消息映射函数OnButton1():
#include "InfoAddDlg.h" void CInfoDlg::OnButton1() { // TODO: Add your control notification handler code here CInfoAddDlg dlg; //在添加信息的对话框的头文件InfoAddDlg.h中加了一个指向本对话框的指针 //以便在添加信息的对话框能够操纵本对话框中的list dlg.m_InfoDlg=this; dlg.DoModal(); }7、“学生信息管理”对话框中的“删除”按钮,写完整个添加对话框中的内容再回来写,这个”添加“对话框中的”下拉列表“是要初始化的,为本对话框添加一个初始化OnInitDialog()函数,里面”下拉列表“的初始化与《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)的是一模一样,只是”普通”、“高级”变成了“1”、“2”而已
BOOL CInfoAddDlg::OnInitDialog() { CDialog::OnInitDialog(); //初始化下拉列表COMBO控件 CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO1); pcombo->AddString("1"); pcombo->AddString("2"); //设置下拉列表COMBO控件默认选项为第一个 pcombo->SetCurSel(0); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }8、然后”添加“对话框仅有一个“添加”按钮需要写函数:
void CInfoAddDlg::OnButton1() { //经过了之前的工作,一句m_InfoDlg->XX,就像直接在CInfoDlg对话框操作本对话框控件一样; CString str; GetDlgItemText(IDC_EDIT1,str); //比较字符串一定要这样比较,不能用== if(strcmp(str,"")==0){ AfxMessageBox("输入的姓名为空!"); return; } int nCount=m_InfoDlg->m_List.GetItemCount(); for(int i=0;i<nCount;i++){ if(strcmp(m_InfoDlg->m_List.GetItemText(i,0),str)==0){ AfxMessageBox("要插入的用户名已经存在!"); return; } } m_InfoDlg->m_List.InsertItem(nCount,str); GetDlgItemText(IDC_COMBO1,str); m_InfoDlg->m_List.SetItemText(nCount,1,str); GetDlgItemText(IDC_DATETIMEPICKER1,str); m_InfoDlg->m_List.SetItemText(nCount,2,str); SetDlgItemText(IDC_EDIT1,""); }这里还是之前的“添加”方法,只是取出下拉列表与日期控件的值,不用像以前的那样的复杂了,其实都可以用GetDlgItemText方法去取。这里注意一下比较字符串的方法,C++与Java一样,字符串是对象,不能直接用基本类型比较符号==去比较,用=就更加搞笑了,你的基础就更加秀逗了。同时还要注意List控件,添加完一行统一用修改列的方法完成“添加”,其实添加方法,一次就生成一行,没有被赋值的列被设置为空而已。
9、这样就做完了“添加”对话框,回到“学生信息管理”对话框中的“删除”按钮,其实这里的代码与《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)一样,还不用遍历,随便删
void CInfoDlg::OnButton2() { POSITION pos=m_List.GetFirstSelectedItemPosition(); int nSel=m_List.GetNextSelectedItem(pos); if(nSel<0) AfxMessageBox("请选中要删除的项!",MB_OK); else{ if(AfxMessageBox("确认删除:"+m_List.GetItemText(nSel,0)+"吗?",MB_YESNO)==IDYES){ m_List.DeleteItem(nSel); } } // TODO: Add your control notification handler code here }
原文:http://blog.csdn.net/yongh701/article/details/43490981