C++课程设计日志(人脸识别+音视频播放器)

前言:

我们本次C++课程设计选题为人脸识别+音视频播放器,主要使用了Visual Studio 的MFC模块进行桌面应用开发。

参考视频:1-人脸识别项目介绍_哔哩哔哩_bilibili

1.创建主界面

首先,我们打开主页面,创建新项目,在项目文件夹的res文件夹中导入预先准备好的文件。进入对话框,然后添加相应控件,编辑好button的ID和图像控件的类型为BITMAP,组成如图界面。

随后我们在资源视图插入背景图,调整窗口大小,使得窗口大小适应背景图。

2.添加登录窗口

重新创建一个界面,添加控件如图所示:

接下来我们要实现主界面与登录界面的连接:

选中登录界面,右击添加MFC类,得到名为WinLogin.cpp的源文件。

回到主界面,双击登录按钮进入代码界面的登录按钮函数并添加以下代码:

void CMyFaceCheckDlg::OnBnClickedButtonLogin()
{
	// 跳转到“登录窗口”
	// 定义一个“登录窗口”变量
	WinLogin win;
	win.DoModal();//模态方式显示窗口
}

在代码开头添加#include "WinLogin.h",这样我们就实现了单击主界面的登录按钮就能跳转到登录界面。

3.实现背景透明

这一部分我们将实现按钮背景的透明化。

首先在文件夹中添加两个预先准备好的ButtonPNG文件,在资源视图导入预先准备好的按钮图片,回到主界面,右击两个登录按钮进行添加变量,变量类型为新添加文件中的ButtonPNG类型。然后打开主界面头文件的代码页,在最下方可以看到新自动添加的变量,在下方定义一个新的CImage类型的变量m_imgBK作为背景图片,打开主界面的cpp文件找到OnInitDialog初始化函数,在函数后面部分(有注释的地方:// TODO: 在此添加额外的初始化代码)添加以下代码:

LoadPicture(m_imgBK, IDB_PNG2);
m_btnLogin.Init(IDB_PNG1, 4, BTN_TYPE_NORMAL);

第一行为绘制背景图片,第二行为对登录按钮的初始化。

接着找到OnPaint函数,在最后else部分修改为以下内容:

else
{
	drawPicOnPait(&m_imgBK, this, 0, 0);
}

其中drawPicOnPait为新导入ButtonPNG文件中的函数,用于绘制按钮图案。

同理对于注册按钮也是一样的操作,我们就得到了两个背景透明的按钮。

4.实现登录界面

这部分我们将实现登录界面。

首先,我们打开登录窗口的对话框,右击button1,添加变量:

然后打开WinLogin.h的头文件,找到class WinLogin : public CDialogEx的类,在public部分定义CImage变量为m_imgBG,然后在资源视图导入预先准备好的背景图片和按钮图片。

然后打开WinLogin.cpp文件,找到BOOL WinLogin::OnInitDialog()的函数,下面我们对背景图片和按钮进行初始化:

BOOL WinLogin::OnInitDialog()
{
	//父类的初始化
	CDialogEx::OnInitDialog();

	//再做自己的初始化
	LoadPicture(m_imgBG, IDB_PNG4);
	m_btnMouse.Init(IDB_PNG5, 4, BTN_TYPE_NORMAL);

然后,我们进入登录窗口对话框,打开属性界面的消息,找到OnPaint函数并勾选添加到代码中,代码如下:

void WinLogin::OnPaint()
{
	drawPicOnPait(&m_imgBG, this, 0, 0);
}

这样我们就实现了图片的初始化。

我们可以在摄像头未打开之前加上雪花背景,并进行定时播放,实现的代码如下:

class WinLogin : public CDialogEx
{
	DECLARE_DYNAMIC(WinLogin)

public:
	WinLogin(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~WinLogin();
	BOOL OnInitDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MYFACECHECK_LOGIN };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	ButtonPNG m_btnMouse;
	CImage m_imgBG;
	afx_msg void OnPaint();
	HBITMAP m_snows[16];
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	CStatic m_snowBG;
};
BOOL WinLogin::OnInitDialog()
{
	//父类的初始化
	CDialogEx::OnInitDialog();

	//再做自己的初始化
	LoadPicture(m_imgBG, IDB_PNG4);
	m_btnMouse.Init(IDB_PNG5, 4, BTN_TYPE_NORMAL);
	CString name;
	for (int i = 0; i < 16; i++) {
		name.Format(L"res/snow/snow_%d.bmp", i);
		m_snows[i] = (HBITMAP)LoadImage(0, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	}

	//启动定时器
	SetTimer(1, 30, NULL);

	::MoveWindow(m_snowBG.m_hWnd, 440, 0, 640, 609, 1);

	return 0;
}
void WinLogin::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_BUTTON1, m_btnMouse);
	DDX_Control(pDX, IDC_SNOW, m_snowBG);
}
void WinLogin::OnTimer(UINT_PTR nIDEvent)
{
	static int snowIndex = 0;
	if (nIDEvent == 1) {
		m_snowBG.SetBitmap(m_snows[snowIndex]);
		snowIndex = (snowIndex + 1) % 16;
	}

	CDialogEx::OnTimer(nIDEvent);
}

这里我们运用到了OnTimer函数,需要在消息中添加。

这样,我们的登录界面就做好了,最后界面效果如下:

5.实现注册窗口

注册窗口和登录窗口除了需要在button1下方添加一个text文本框之外,其它操作基本一致,在这里我就不多赘述,下方附上相关代码:

// WinReg.cpp: 实现文件
//

#include "pch.h"
#include "MyFaceCheck.h"
#include "afxdialogex.h"
#include "WinReg.h"


// WinReg 对话框

IMPLEMENT_DYNAMIC(WinReg, CDialogEx)

WinReg::WinReg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MYFACECHECK_REG, pParent)
{

}

WinReg::~WinReg()
{
}

void WinReg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_BUTTON1, m_btnMouse);
	DDX_Control(pDX, IDC_EDIT1, m_name);
	DDX_Control(pDX, IDC_SNOW, m_snowBG);
}


BEGIN_MESSAGE_MAP(WinReg, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &WinReg::OnBnClickedButton1)
	ON_WM_PAINT()
	ON_WM_TIMER()
END_MESSAGE_MAP()


// WinReg 消息处理程序


BOOL WinReg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	LoadPicture(m_faceBg, IDB_PNG4);
	m_btnMouse.Init(IDB_PNG5, 4, BTN_TYPE_NORMAL);
	
	CString name;
	for (int i = 0; i < 16; i++) {
		name.Format(L"res/snow/snow_%d.bmp", i);
		m_snows[i] =(HBITMAP) LoadImage(0, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	}
	
	SetTimer(1, 30, NULL);

	CFont font;
	font.CreatePointFont(200, L"花文行楷", NULL);
	m_name.SetFont(&font);

	::MoveWindow(m_snowBG.m_hWnd, 440, 0, 640, 609, 1);
	return 0;
}

void WinReg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
}


void WinReg::OnPaint()
{
	drawPicOnPait(&m_faceBg, this, 0, 0);
}


void WinReg::OnTimer(UINT_PTR nIDEvent)
{
	static int snowIndex = 0;
	if (nIDEvent == 1) {
		m_snowBG.SetBitmap(m_snows[snowIndex]);
		snowIndex = (snowIndex + 1) % 16;
	}


	CDialogEx::OnTimer(nIDEvent);
}

#pragma once
#include "afxdialogex.h"
#include "ButtonPNG.h"

// WinReg 对话框

class WinReg : public CDialogEx
{
	DECLARE_DYNAMIC(WinReg)

public:
	WinReg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~WinReg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MYFACECHECK_REG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	BOOL OnInitDialog();
	
	afx_msg void OnBnClickedButton1();
	ButtonPNG m_btnMouse;
	CEdit m_name;
	CStatic m_snowBG;
	CImage m_faceBg;
	afx_msg void OnPaint();
	HBITMAP m_snows[16];
	afx_msg void OnTimer(UINT_PTR nIDEvent);
};

最终效果如下:

这样我们就完成了注册窗口的创建。

  • 35
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值