我的第一个MFC程序------登录对话框简单实现

声明:主要参考网址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 }

运行效果如下:

posted @ 2013-02-25 18:56  小楼一夜听风雨  阅读(11983)  评论(0编辑  收藏  举报