MFC单文档实验(SDI/登录/图片)

2020/12/28 10:41
阅读数 70

一、新建MFC单文档

在这里插入图片描述
在VS(这里是VS2017)中新建MFC项目->选择单个文档,选择MFC标准,点击完成,单文档项目就新建好了。

二、新建菜单

在这里插入图片描述
在资源视图的主菜单中新插入图片中的Login/PhotoS/H等菜单键。
在这里插入图片描述
右键菜单键,分别添加事件处理程序如上图 command 类型,放在 Doc 中。


三、初始化View

先在类 xxDoc.h 的 public 中定义如下变量

public:
	CString m_name, m_num, m_pw, m_sex,m_text;//姓名学号等
	int m_show;//图片
	int m_flag;//判断是否登录

在这里插入图片描述

再在 xxDoc.cpp 中对 m_text 初始化,如上图。
在这里插入图片描述
最后,在xxView.cpp的OnDraw()函数中将pDC的注释解除,并添加上图红方框中的代码。
运行查看结果:
在这里插入图片描述



四、Login模块

在这里插入图片描述
新插入对话框,并完成以上操作。
右键对话框,给Login对话框新建类 login.h 。
在类 login.h 的 public 中添加以下变量:


CString name1, num1, pw1, sex1;

在xxDoc.cpp中添加头文件 #include “login.h” ,将Login对话框与Doc关联。

双击男和女按钮,自动创建按钮函数,并在男按钮函数中添加:

sex1 = "男";

女按钮函数中添加:

sex1 = "女";

双击确定按钮,自动创建OK函数,在函数中添加代码如下:

void login::OnBnClickedOk()
{
   
   
	// TODO: 在此添加控件通知处理程序代码
	GetDlgItemText(IDC_EDIT1, name1);
	GetDlgItemText(IDC_EDIT2, num1);
	GetDlgItemText(IDC_EDIT3, pw1);
	if (sex1 == L"" || name1 == L"" || num1 == L"")
	{
   
   
		MessageBox(L"please input all information!");
		return;
	}

	if (name1 == L"1"&&num1 == L"1" && pw1 == L"1")
		CDialog::OnOK();
	else
		MessageBox(L"error name or number!");
}

这里我定义的姓名学号密码都是1。

在OnExceLogin()中添加代码如下:

void CTestDoc::OnExceLogin()
{
   
   
	// TODO: 在此添加命令处理程序代码
	login ldlg;
	if(ldlg.DoModal()==IDOK)
	{
   
   
		m_name = ldlg.name1;
		m_num = ldlg.num1;
		m_sex = ldlg.sex1;
		m_pw = ldlg.pw1;
		m_flag = 1;
		UpdateAllViews(NULL);
	}
}

Login功能就已经完成了,接下来,将登录的数据传输给View,在 View.cpp 的 OnDraw()函数中添加如下代码:

	if(pDoc->m_flag==1)
	{
   
   
		CString temp;
		str = pDoc->m_name;
		temp.Format(L"姓名:%s", str);
		sizeText = pDC->GetTextExtent(str);
		pDC->TextOut(10, sizeText.cy , temp);

		temp;
		str = pDoc->m_num;
		temp.Format(L"学号:%s", str);
		sizeText = pDC->GetTextExtent(str);
		pDC->TextOut(10, sizeText.cy * 2, temp);

		temp;
		str = pDoc->m_sex;
		temp.Format(L"性别:%s", str);
		sizeText = pDC->GetTextExtent(str);
		pDC->TextOut(10, sizeText.cy * 3, temp);
	}

运行效果:
在这里插入图片描述
这就是登录成功的效果。

五、PhotoS/H模块

在这里插入图片描述
在xx.rc右键,导入bitmap资源,如上图。

和m_text一样,在Doc中初始化m_show,

 m_show=-1;

在Doc.cpp的OnExecPhoto()中添加代码如下:

void CsdiDoc::OnExecPhoto()
{
   
   
	// TODO: 在此添加命令处理程序代码
	if (m_flag!=1)
	{
   
   
		AfxMessageBox(L"please login!");
	}
	else
		m_show=-m_show;
	UpdateAllViews(NULL);
}

在View.cpp的OnDrow()下的
if (pDoc->m_flag == 1)
{
}中添加代码,如下:


	if (pDoc->m_flag == 1)
	{
   
   
		
		if (pDoc->m_show == 1) {
   
   
			CDC dc;
			dc.CreateCompatibleDC(pDC);
			CBitmap bmp;
			bmp.LoadBitmapW(IDB_BITMAP2);//这是bmp图片的ID
			BITMAP info;
			bmp.GetBitmap(&info);
			dc.SelectObject(bmp);
			pDC->BitBlt(10, sizeText.cy * 5, info.bmWidth, info.bmHeight, &dc, 0, 0, SRCCOPY);
		}
	}

运行效果:
在这里插入图片描述
登录后,点击PhotoS/H菜单键,可以显示或隐藏图片。
到此为止,实验就完成了,下面是一些拓展模块。


六、给Login添加动态背景

参考我的另一篇博客,链接: MFC对话框动态背景.

七、修改密码模块

因为要给它添加修改密码和注册功能,所以有多个帐号,且在不同的对话框,这里就需要用到全局变量了。
在主文件的类xx.h中定义全局变量

	CString num[5], pw[5];
	int n;

在这里插入图片描述

新添加修改密码对话框如上图,并新建类 changepw.h 。
在 changepw.h 的 public 中添加变量

	CString pw2,pw3;

双击确定,自动创建OK函数,
在OK函数中添加代码如下:

	GetDlgItemText(IDC_EDIT1, pw2);
	GetDlgItemText(IDC_EDIT2, pw3);
	if (pw2 == L"" || pw3 == L"")
	{
   
   
		MessageBox(L"please input all information!");
		return;
	}
	if (pw2 != pw3)
	{
   
   
		MessageBox(L"两次输入不一致!");
		return;
	}
	else
	{
   
   
		theApp.pw[1] = pw3;
		MessageBox(L"修改成功!");
		CDialog::OnOK();
	}

并在之前Login对话框中判断登录的条件改成:

if (name1 == L"1"&&num1 == L"1" && (pw1 == L"1"||pw1==theApp.pw[1]))

在Doc.cpp中添加头文件 :

#include"changepw.h" 

并在Doc.cpp 的 OnExceChangepw()函数中添加代码:

void CTestDoc::OnExceChangepw()
{
   
   
	// TODO: 在此添加命令处理程序代码
	changepw cdlg;
	cdlg.DoModal();
}

完成,现在,你就可以修改你的密码了(这里很简略,没有将密码与全局变量关联,所以你的新密码和旧密码都有效,等有空再继续更新)。

八、注册模块

休息中~有空就更新!

展开阅读全文
c++
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部