自学存档专用抬头
Windows应用程序首先会调用WinMain入口函数, 再注册并创建窗口类, 并显示更新窗口,采用消息循环机制与操作系统交互. 操作系统接收到程序的窗口消息,将消息传入到应用程序的消息队列中,应用程序通过一些预处理(临时取消或新增相应)然后回传给系统,系统调用窗口过程对消息进行处理。
MFC相比Win32来说,内层框架封装了WinMain函数。必须从CWinApp类派生程序类CxxxApp,并定义了一个全局对象theApp,该类的InitInstance虚函数需重写来实现窗体的创建,而且MFC也可以直接实例或派生其窗体类。
效果图如下:
登录对话框所需新建如下:
Tips:
MFC通过自调用消息映射机制(通过C语言宏将消息与消息函数一一对应)调用相应的消息处理函数。在DECLARE_MESSAGE_MAP中为对应的映射方式。将Windows消息分为三大类:普通窗口函数、命令消息、控件通知消息。
1)普通窗口函数——关联与操作窗口相关的动作,以ON_WM宏进行映射,如鼠标点击,键盘输入;
2)命令消息——来自菜单、工具栏和加速键的通知消息,使用ON_COMMAND宏进行隐射响应,一个函数可对多个同名ID按钮相应;
3)控件通知消息——通过WM_COMMAND消息发送给父窗口。
以Afx开头表明为全局函数,Messagebox也适用于win32 SDK, 可以自定义标题.
进入正题,先创建一个简易版的登录界面:
1、先创建一个SDI程序,然后在资源视图中新增一个对话框,新建对应的对话框类可以左键双击对话框,或是点击MFC ClassWizard。(该类派生自CDlialog)
2、在对话框视图中拖拽控件工具形成基本的登录界面,密码控件需勾选Password属性保护输入信息。
3、右击对话框“OK”按钮进入MFC ClassWizard,创建响应消息函数OnOK。
4、双击图中“1”选中的ID号,或是选中后按“2 增加变量”,即可打开新增变量视图,在类别选择Control,输入对应的变量名即可。
5、接下来完善代码, 重载对话框新类的OnOK判定登录信息, 然后在工程App类InitInstance中对判定结果实现不同情况下的操作.
1)定义两个局部变量, 用于接收控件文本; 然后是否if判定用户名与密码是否匹配;
void CDlgLogin::OnOK()
{
// TODO: Add extra validation here
CString username,password;
m_edit_username.GetWindowText(username);
m_edit_password.GetWindowText(password);
//如果不想使用以上变量进行传递,也可以增加变量型控件对象CString,直接使用UpdateData(TRUE)
//将输入的值转入到对应的CString控件变量中
//
if(username=="Jennifer"&&password=="520")
{
CDialog::OnOK();
}
else
{
AfxMessageBox("user don't exists, please try again!");
//此处也可以设置密码清零以及文本焦点
m_edit_password.SetWindowText("");//清空密码文本框
m_edit_password.SetFocus();//设置密码文本框为当前的焦点,即无需点击密码文本框
}
}
2)在CxxxxApp中的InitInstance中实例化创建对象Login(注意添加CDlgLogin头文件,否则无法创建实例),并在并使用DoModal判定Login是否执行,成功则创建程序主窗口,否则返回提示.
#include "CDlgLogin.h"
......
......
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CDlgLogin Login;
if(IDOK==Login.DoModal())
{
CSingleDocTemplate* pDocTemplate;
... ...
m_pMainWnd->ShowWindow(SW_SHOW);
//这里可以定义主程序界面的标题
//m_pMainWnd->SetWindowText("成功登陆!!!");
m_pMainWnd->UpdateWindow();
}
else
{
AfxMessageBox("please try again!"); //提示错误
return FALSE;
}
6、大功告成
#190316#