mfc设计一个登录窗口(如下图所示),如果用户名及密码正确,则弹出消息框显示“登录成功!”,如果错误,则显示相应的提示信息并允许用户选择“重试”或“取消”。如果连续三次出现错误,则终止程序。
时间: 2023-12-26 07:04:06 浏览: 29
好的,这是一个经典的MFC登录窗口设计。我们可以通过以下步骤来实现:
1. 创建一个MFC对话框应用程序。在资源视图中添加一个对话框,然后在对话框中添加用户名、密码和登录按钮等控件。
2. 在对话框类中添加成员变量,分别对应用户名和密码的文本框。
3. 在登录按钮的单击事件中,获取文本框中的用户名和密码,并进行验证。如果用户名和密码正确,弹出“登录成功!”的消息框;否则根据错误情况弹出相应的提示信息,供用户选择“重试”或“取消”。
4. 在对话框类中添加计数器变量,用于记录错误次数。如果连续三次出现错误,则终止程序。
下面是示例代码:
首先是对话框类的头文件:
```c++
#pragma once
class CLoginDlg : public CDialogEx
{
public:
CLoginDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_LOGIN_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
CString m_strUsername;
CString m_strPassword;
CEdit m_editUsername;
CEdit m_editPassword;
int m_nErrorCount;
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnBtnLoginClicked();
DECLARE_MESSAGE_MAP()
};
```
然后是实现文件:
```c++
#include "pch.h"
#include "Login.h"
#include "LoginDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CLoginDlg::CLoginDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_LOGIN_DIALOG, pParent)
, m_strUsername(_T(""))
, m_strPassword(_T(""))
, m_nErrorCount(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_USERNAME, m_editUsername);
DDX_Control(pDX, IDC_EDIT_PASSWORD, m_editPassword);
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_LOGIN, &CLoginDlg::OnBtnLoginClicked)
END_MESSAGE_MAP()
BOOL CLoginDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置图标
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
return TRUE;
}
void CLoginDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 居中绘制图标
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CLoginDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CLoginDlg::OnBtnLoginClicked()
{
// 获取用户名和密码
m_editUsername.GetWindowText(m_strUsername);
m_editPassword.GetWindowText(m_strPassword);
// 验证用户名和密码
if (m_strUsername == _T("admin") && m_strPassword == _T("admin"))
{
// 登录成功
MessageBox(_T("登录成功!"), _T("提示"), MB_OK);
EndDialog(IDOK);
}
else
{
// 登录失败
m_nErrorCount++;
CString strMsg;
if (m_nErrorCount >= 3)
{
// 错误次数超过3次,终止程序
strMsg = _T("登录失败,错误次数超过3次,程序即将退出!");
MessageBox(strMsg, _T("错误"), MB_OK | MB_ICONERROR);
EndDialog(IDCANCEL);
}
else
{
// 错误次数未超过3次,提示用户重试或取消
strMsg = _T("用户名或密码错误,请重试!");
int nRet = MessageBox(strMsg, _T("错误"), MB_RETRYCANCEL | MB_ICONERROR);
if (nRet == IDRETRY)
{
// 用户选择重试
m_editUsername.SetWindowText(_T(""));
m_editPassword.SetWindowText(_T(""));
}
else
{
// 用户选择取消
EndDialog(IDCANCEL);
}
}
}
}
```
这样,我们就完成了一个基本的MFC登录窗口设计。