您的位置:首页 > 其它

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

2013-02-25 18:56 537 查看
声明:主要参考网址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()创建一个模态对话框(在当前对话框操作完成之前不能对其它对话框进行操作):

// 在返回前加载登录界面
CDlg_Login dlg;
dlg.DoModal();


5、添加默认Button(确认和取消)的关联函数OnOK()和OnCancel();

void CDlg_Login::OnOK()
{
// TODO: Add extra validation here
this->UpdateData(true);
CWnd *pWnd = NULL;
// 验证用户名、密码是否正确
if (this->m_user != "test")
{
MessageBox("用户名错误,请重新输入!");
m_user = "";
pWnd = GetDlgItem(IDC_USER); // 获取IDC_USER的控件指针
pWnd->SetFocus(); // 设置焦点
UpdateData(false);
}
else if (this->m_password != "test")
{
MessageBox("密码错误,请重新输入!");
m_password = "";
pWnd = GetDlgItem(IDC_PASSWORD);
pWnd->SetFocus();
UpdateData(false);
}
else
{
CDialog::OnOK();
}
}


void CDlg_Login::OnCancel()
{
// TODO: Add extra cleanup here
AfxGetMainWnd()->PostMessage(WM_QUIT); // 发送WM_QUIT消息退出程序
CDialog::OnCancel();
}


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()指定的时间间隔中调用一次。

上代码:

BOOL CDlg_Login::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
SetTimer(1, 1000, NULL); // 计时,以1000毫秒为单位
return TRUE;  // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CDlg_Login::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime time = CTime::GetCurrentTime(); // 获取当前系统时间
CString strtime = time.Format(_TEXT("日期:%Y-%m-%d  时间:%H:%M:%S")); // 格式化为CString类型
SetDlgItemText(IDC_TIME, strtime); // 在IDC_TIME中显示

CDialog::OnTimer(nIDEvent);
}


运行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: