首先,创建一个MFC应用程序,并添加两个对话框:登录对话框和注册对话框。在登录对话框中添加用户名和密码的输入框,以及登录和注册按钮;在注册对话框中添加用户名、密码和确认密码的输入框,以及注册按钮。
在程序的主窗口类中添加以下代码:
class CMyAppDlg : public CDialogEx
{
public:
CMyAppDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MYAPP_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
CLoginDlg m_loginDlg;
CRegisterDlg m_registerDlg;
CString m_strUserName;
CString m_strPassword;
CString m_strConfirmPassword;
public:
afx_msg void OnBnClickedBtnLogin();
afx_msg void OnBnClickedBtnRegister();
};
在OnInitDialog()函数中,将登录对话框和注册对话框的指针保存下来,以便后续调用。同时,为登录按钮和注册按钮添加消息响应函数。
BOOL CMyAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_loginDlg.Create(IDD_LOGIN_DIALOG, this);
m_registerDlg.Create(IDD_REGISTER_DIALOG, this);
return TRUE;
}
登录按钮的消息响应函数如下:
void CMyAppDlg::OnBnClickedBtnLogin()
{
m_loginDlg.ShowWindow(SW_SHOW);
}
点击登录按钮后,显示登录对话框。
注册按钮的消息响应函数如下:
void CMyAppDlg::OnBnClickedBtnRegister()
{
m_registerDlg.ShowWindow(SW_SHOW);
}
点击注册按钮后,显示注册对话框。
在登录对话框类和注册对话框类中,分别添加用户名、密码和确认密码的成员变量,并在DoDataExchange()函数中添加数据交换。在登录对话框类中,添加一个登录按钮的消息响应函数,用于验证用户名和密码;在注册对话框类中,添加一个注册按钮的消息响应函数,用于验证用户名和密码是否符合要求,并将其保存到文件中。
登录对话框类的代码如下:
class CLoginDlg : public CDialogEx
{
public:
CLoginDlg(CWnd* pParent = nullptr);
virtual ~CLoginDlg();
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_LOGIN_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
CString m_strUserName;
CString m_strPassword;
CEdit m_editUserName;
CEdit m_editPassword;
public:
afx_msg void OnBnClickedBtnLogin();
};
登录对话框类的DoDataExchange()函数如下:
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_USERNAME, m_strUserName);
DDX_Text(pDX, IDC_EDIT_PASSWORD, m_strPassword);
DDX_Control(pDX, IDC_EDIT_USERNAME, m_editUserName);
DDX_Control(pDX, IDC_EDIT_PASSWORD, m_editPassword);
}
登录按钮的消息响应函数如下:
void CLoginDlg::OnBnClickedBtnLogin()
{
UpdateData(TRUE);
if (m_strUserName.IsEmpty() || m_strPassword.IsEmpty())
{
MessageBox(_T("用户名或密码不能为空!"), _T("错误"), MB_OK | MB_ICONERROR);
return;
}
CString strFilePath = _T("users.txt");
CStdioFile file;
if (file.Open(strFilePath, CFile::modeRead))
{
CString strLine;
while (file.ReadString(strLine))
{
CString strUserName, strPassword;
int nIndex = strLine.Find(_T(':'));
if (nIndex != -1)
{
strUserName = strLine.Left(nIndex);
strPassword = strLine.Mid(nIndex + 1);
if (strUserName == m_strUserName && strPassword == m_strPassword)
{
MessageBox(_T("登录成功!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
EndDialog(IDOK);
return;
}
}
}
file.Close();
}
MessageBox(_T("用户名或密码错误!"), _T("错误"), MB_OK | MB_ICONERROR);
}
在登录按钮的消息响应函数中,首先获取用户名和密码的输入值,然后判断它们是否为空。如果为空,则弹出错误提示框;否则,打开保存用户信息的文件,逐行读取文件内容,查找用户名和密码是否匹配。如果匹配,则弹出成功提示框,并关闭登录对话框;否则,弹出错误提示框。
注册对话框类的代码如下:
class CRegisterDlg : public CDialogEx
{
public:
CRegisterDlg(CWnd* pParent = nullptr);
virtual ~CRegisterDlg();
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_REGISTER_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
CString m_strUserName;
CString m_strPassword;
CString m_strConfirmPassword;
CEdit m_editUserName;
CEdit m_editPassword;
CEdit m_editConfirmPassword;
public:
afx_msg void OnBnClickedBtnRegister();
};
注册对话框类的DoDataExchange()函数如下:
void CRegisterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_USERNAME, m_strUserName);
DDX_Text(pDX, IDC_EDIT_PASSWORD, m_strPassword);
DDX_Text(pDX, IDC_EDIT_CONFIRM_PASSWORD, m_strConfirmPassword);
DDX_Control(pDX, IDC_EDIT_USERNAME, m_editUserName);
DDX_Control(pDX, IDC_EDIT_PASSWORD, m_editPassword);
DDX_Control(pDX, IDC_EDIT_CONFIRM_PASSWORD, m_editConfirmPassword);
}
注册按钮的消息响应函数如下:
void CRegisterDlg::OnBnClickedBtnRegister()
{
UpdateData(TRUE);
if (m_strUserName.IsEmpty() || m_strPassword.IsEmpty() || m_strConfirmPassword.IsEmpty())
{
MessageBox(_T("用户名、密码或确认密码不能为空!"), _T("错误"), MB_OK | MB_ICONERROR);
return;
}
if (m_strPassword != m_strConfirmPassword)
{
MessageBox(_T("密码和确认密码不一致!"), _T("错误"), MB_OK | MB_ICONERROR);
return;
}
CString strFilePath = _T("users.txt");
CStdioFile file;
if (file.Open(strFilePath, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite))
{
CString strLine;
while (file.ReadString(strLine))
{
CString strUserName;
int nIndex = strLine.Find(_T(':'));
if (nIndex != -1)
{
strUserName = strLine.Left(nIndex);
if (strUserName == m_strUserName)
{
MessageBox(_T("用户名已存在!"), _T("错误"), MB_OK | MB_ICONERROR);
file.Close();
return;
}
}
}
file.SeekToEnd();
file.WriteString(m_strUserName + _T(':') + m_strPassword + _T('n'));
file.Close();
MessageBox(_T("注册成功!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
EndDialog(IDOK);
}
}
在注册按钮的消息响应函数中,首先获取用户名、密码和确认密码的输入值,然后判断它们是否为空,以及密码和确认密码是否一致。如果有任何一个条件不符合要求,则弹出错误提示框;否则,打开保存用户信息的文件,逐行读取文件内容,查找用户名是否已存在。如果已存在,则弹出错误提示框;否则,将用户名和密码保存到文件中,并弹出成功提示框,并关闭注册对话框。
相关知识
一个用MFC的DC实现画图的工具带各种控件资源
用户登录
用户登录界面设计代码html
鲜花预约配送系统:从需求分析到功能实现
【详细源码及文档】基于JSP网上花店销售系统的设计与实现
MFC=VisualC6.0library.rar很好的MFC=Visual C++6.0类库大全
AI 绘画新秀 Leonardo 保姆级注册、使用教程
登录/注册
基于Javaweb的网上花店系统的设计与实现(Java+Mysql+SSM+万字文档+系统源码+数据库 +调试)
基于SpringBoot+Vue+uniapp的花卉库存管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
网址: MFC用户注册和登录功能实现(详细) https://m.huajiangbk.com/newsview948793.html
| 上一篇: SSM(3) —— 用户注册和登 |
下一篇: ASP.NET 链接sql数据库 |