mfc登陆窗口,要求使用账号和密码登陆。有一文本文件存储有多个用户的个人信息,一个用户的信息占一行,格式为姓名,账号,密码,身份证号,余额。文本中任意一个用户可以输入自己的账号和密码登陆。登陆成功后进入另一个窗口,该用户能在此窗口通过点击查询按钮,通过在登录窗口已经输入过的账号和密码在文本文件中匹配到属于该用户的那一行用户信息,查看自己的相关个人信息并显示出来。具体代码
时间: 2024-02-29 14:54:58 浏览: 24
以下是一个基于MFC框架的简单登陆窗口和个人信息查询窗口的代码示例,其中假设文本文件名为"users.txt",保存在程序运行目录下:
首先是登陆窗口 LoginDlg:
```
#include "stdafx.h"
#include "LoginDlg.h"
#include "afxdialogex.h"
#include <fstream>
using namespace std;
// LoginDlg 对话框
IMPLEMENT_DYNAMIC(LoginDlg, CDialogEx)
LoginDlg::LoginDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_LOGIN_DIALOG, pParent)
{
}
LoginDlg::~LoginDlg()
{
}
void LoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_USERNAME_EDIT, m_UsernameEdit);
DDX_Control(pDX, IDC_PASSWORD_EDIT, m_PasswordEdit);
}
BEGIN_MESSAGE_MAP(LoginDlg, CDialogEx)
ON_BN_CLICKED(IDC_LOGIN_BUTTON, &LoginDlg::OnBnClickedLoginButton)
END_MESSAGE_MAP()
// LoginDlg 消息处理程序
void LoginDlg::OnBnClickedLoginButton()
{
// 读取用户信息文件
ifstream infile("users.txt");
if (!infile)
{
AfxMessageBox(_T("无法打开用户信息文件!"));
return;
}
CString username, password;
m_UsernameEdit.GetWindowText(username);
m_PasswordEdit.GetWindowText(password);
string line;
while (getline(infile, line))
{
// 将一行用户信息拆分为姓名、账号、密码、身份证号、余额五个字段
string name, account, passwd, id_card, balance;
istringstream iss(line);
iss >> name >> account >> passwd >> id_card >> balance;
// 如果账号和密码匹配,则登陆成功
if (CT2A(username) == account && CT2A(password) == passwd)
{
infile.close();
// 显示个人信息窗口
PersonalInfoDlg dlg(name.c_str(), account.c_str(), id_card.c_str(), balance.c_str());
dlg.DoModal();
return;
}
}
infile.close();
AfxMessageBox(_T("账号或密码错误!"));
}
```
其次是个人信息查询窗口 PersonalInfoDlg:
```
#include "stdafx.h"
#include "PersonalInfoDlg.h"
#include "afxdialogex.h"
using namespace std;
// PersonalInfoDlg 对话框
IMPLEMENT_DYNAMIC(PersonalInfoDlg, CDialogEx)
PersonalInfoDlg::PersonalInfoDlg(LPCTSTR name, LPCTSTR account, LPCTSTR id_card, LPCTSTR balance, CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_PERSONAL_INFO_DIALOG, pParent), m_Name(name), m_Account(account), m_IDCard(id_card), m_Balance(balance)
{
}
PersonalInfoDlg::~PersonalInfoDlg()
{
}
void PersonalInfoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_NAME_STATIC, m_Name);
DDX_Text(pDX, IDC_ACCOUNT_STATIC, m_Account);
DDX_Text(pDX, IDC_IDCARD_STATIC, m_IDCard);
DDX_Text(pDX, IDC_BALANCE_STATIC, m_Balance);
}
BEGIN_MESSAGE_MAP(PersonalInfoDlg, CDialogEx)
END_MESSAGE_MAP()
// PersonalInfoDlg 消息处理程序
```
需要注意的是,个人信息查询窗口的界面需要自行设计,这里只提供了一个简单的示例。
最后是主窗口的代码,其中只需要在OnInitDialog函数中调用登陆窗口即可:
```
#include "stdafx.h"
#include "MFCApp.h"
#include "MFCAppDlg.h"
#include "afxdialogex.h"
#include "LoginDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMFCAppDlg 对话框
CMFCAppDlg::CMFCAppDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MFCAPP_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCAppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFCAppDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_EXIT_BUTTON, &CMFCAppDlg::OnBnClickedExitButton)
END_MESSAGE_MAP()
// CMFCAppDlg 消息处理程序
BOOL CMFCAppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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); // 设置小图标
// TODO: 在此添加额外的初始化代码
LoginDlg dlg;
dlg.DoModal();
return FALSE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCAppDlg::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 CMFCAppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCAppDlg::OnBnClickedExitButton()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
```
完整代码文件可见附件。