声明:主要参考网址http://wenku.baidu.com/view/52582de8172ded630b1cb6a6.html
如果文中有错误的地方,还请各路大神指正、教育,谢谢。
功能:在进入单文档之前弹出登录界面,在正确输入用户名、密码的情况下才可跳转。
总结记录:
1、建立一个MFC单文档应用程序;
2、在Resource视图中添加一个Dialog并建立对应的类(public继承CDialog);
3、添加必要的控件,如静态文本框(用于描述控件和显示当前时间)、文本编辑框(用于输入用户名和密码);
4、给用户名和密码(均为文本编辑框)关联类成员变量m_password、m_user。此时运行程序并没有出现添加的Dialog。在MFC中窗口的注册和产生由Creat()完成,而在产生窗口之前,MFC提供了OnCreate()给实现者对要生成的窗口进行修改,百度百科解释如下:
一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。就拿CMainFrame类来说,当窗口创建后会产生WM_CREATE消息,我们可以在OnCreate函数里实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。
这就意味着我们可以重载OnCreate()来实现在某个窗口创建时附加首先要做的事情。于是,在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中return 0;前添加如下代码,其中DoMdal()创建一个模态对话框(在当前对话框操作完成之前不能对其它对话框进行操作):
1 // 在返回前加载登录界面 2 CDlg_Login dlg; 3 dlg.DoModal();
5、添加默认Button(确认和取消)的关联函数OnOK()和OnCancel();
1 void CDlg_Login::OnOK() 2 { 3 // TODO: Add extra validation here 4 this->UpdateData(true); 5 CWnd *pWnd = NULL; 6 // 验证用户名、密码是否正确 7 if (this->m_user != "test") 8 { 9 MessageBox("用户名错误,请重新输入!"); 10 m_user = ""; 11 pWnd = GetDlgItem(IDC_USER); // 获取IDC_USER的控件指针 12 pWnd->SetFocus(); // 设置焦点 13 UpdateData(false); 14 } 15 else if (this->m_password != "test") 16 { 17 MessageBox("密码错误,请重新输入!"); 18 m_password = ""; 19 pWnd = GetDlgItem(IDC_PASSWORD); 20 pWnd->SetFocus(); 21 UpdateData(false); 22 } 23 else 24 { 25 CDialog::OnOK(); 26 } 27 }
1 void CDlg_Login::OnCancel() 2 { 3 // TODO: Add extra cleanup here 4 AfxGetMainWnd()->PostMessage(WM_QUIT); // 发送WM_QUIT消息退出程序 5 CDialog::OnCancel(); 6 }
6、为了让界面不那么单调,我在右上角加了一个显示当前系统时间的静态文本控件。此处参照孙鑫老师的教学视频,由于当时看的时候距现在时间有点长,具体是哪个课程忘记了(网上有免费下载)。这里要用到OnInitDialog()函数。顾名思义,这是初始化函数,一些控件的初始化即可在这里面完成,静态文本控件当然也不例外。这里要注意一下,有的时候这个函数默认是没有的,这时候需要手动进行添加。为了达到效果在这个函数里面调用了SetTimer()函数来进行计时,对于这个函数,MSDN解释如下:
This method installs a system timer. A time-out value is specified, and every time a time-out occurs, the system posts a WM_TIMER message to the message queue of the installing application or passes the message to an application-defined TimerProccallback function.
它主要用来记时,在指定的时间间隔中发送一次WM_TIMER消息给应用程序消息队列或者发送消息给定义的应用程序TimerProccallback函数。(翻译不准的话请指正,免得误人子弟)。只要计时函数是不够的,还需要有有响应处理函数,这时需要另外一个函数OnTimer(),同样参考MSDN:
The framework calls this member function after each interval specified in the SetTimer member function used to install a timer.
由此知道,这个成员函数由框架在每隔SetTimer()指定的时间间隔中调用一次。
上代码:
1 BOOL CDlg_Login::OnInitDialog() 2 { 3 CDialog::OnInitDialog(); 4 5 // TODO: Add extra initialization here 6 SetTimer(1, 1000, NULL); // 计时,以1000毫秒为单位 7 return TRUE; // return TRUE unless you set the focus to a control 8 // EXCEPTION: OCX Property Pages should return FALSE 9 } 10 11 void CDlg_Login::OnTimer(UINT nIDEvent) 12 { 13 // TODO: Add your message handler code here and/or call default 14 CTime time = CTime::GetCurrentTime(); // 获取当前系统时间 15 CString strtime = time.Format(_TEXT("日期:%Y-%m-%d 时间:%H:%M:%S")); // 格式化为CString类型 16 SetDlgItemText(IDC_TIME, strtime); // 在IDC_TIME中显示 17 18 CDialog::OnTimer(nIDEvent); 19 }
运行效果如下: