基于MFC的对话框程序添加启动画面

  1. 创建一个基于对话框的工程,名曰“demo”,系统会自动生成一些文件。包含一个Dlg,这是主函数的Dlg。

  2. 在资源管理器中插入一个新的对话框和一张位图,ID设置为IDD_SPLASH,
    ps:位图放在res目录下
    基于MFC的对话框程序添加启动画面_第1张图片

  3. 在对话框上面添加一个picture控件,类型设为”Bitmap”,图像选择刚才插入的位图。
    基于MFC的对话框程序添加启动画面_第2张图片

  4. 设置对话框的Style为Popup,Border为None,去掉TitleBar属性,并调整对话框的大小与位图等大,这样对话框显示的时候,你看到的只是图片。如下:
    基于MFC的对话框程序添加启动画面_第3张图片

  5. 右键界面,点击‘添加类”,建立一个新类CSplashDlg,基类为CDialog。
    基于MFC的对话框程序添加启动画面_第4张图片

  6. 接下来创建一个UI线程。使用快捷键Ctrl+shift+X 打开类向导,点击最上面右边的添加类旁边的小三角,选择“MFC类”,类名叫CSplashThread,基类是CWinThread。如下图:
    基于MFC的对话框程序添加启动画面_第5张图片
    基于MFC的对话框程序添加启动画面_第6张图片

  7. 在生成的SplashThread.h 中加入 #include"CSplashDlg.h",并添加一个protected型指针变量,如下:

#include"SplashDlg.h"
class CSplashThread : public CWinThread
{
...
protected:
	CSplashDlg* m_pSplashDlg;
...
};

基于MFC的对话框程序添加启动画面_第7张图片

  1. 在UI线程的 InitInstance() 函数中调用刚才创建的对话框并显示。
BOOL CSplashThread::InitInstance()
{
	// TODO:    在此执行任意逐线程初始化
	::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE);
	//:通常系统内的每个线程都有自己的输入队列。本函数允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 . (这个函数可以不用)
	m_pSplashDlg = new CSplashDlg;
	m_pSplashDlg->Create(IDD_SPLASH);
	m_pSplashDlg->ShowWindow(SW_SHOW);
	return TRUE;
}

基于MFC的对话框程序添加启动画面_第8张图片

  1. 为CSplashThread类添加一个函数 HideSplash() , 用来隐藏启动画面(即关闭对话框)
	void HideSplash();
void CSplashThread::HideSplash()
{
	m_pSplashDlg->SendMessage(WM_CLOSE);
}

基于MFC的对话框程序添加启动画面_第9张图片
基于MFC的对话框程序添加启动画面_第10张图片

  1. 在主函数创建完之后是需要把这个界面给影藏掉的,或者销毁掉,所以在线程退出函数那里写上如下代码:
int CSplashThread::ExitInstance()
{
	// TODO:    在此执行任意逐线程清理
	m_pSplashDlg->DestroyWindow();
	if (m_pSplashDlg != NULL)
	{
		delete m_pSplashDlg;
	}
	return CWinThread::ExitInstance();
}

基于MFC的对话框程序添加启动画面_第11张图片

  1. 在应用程序进入的地方,即本项目的 CdemoApp(也就是demo.h)的初始化函数中。
    引入上面生成的两个文件,并在public中添加两个变量,如下:
#include "resource.h"		// 主符号
#include "CSplashThread.h"

class CdemoApp : public CWinApp
{
public:
    ...
	CSplashThread* pSplashThread;
	CSplashDlg* m_pSplashDlg;
    ...
}

基于MFC的对话框程序添加启动画面_第12张图片

  1. 在初始化函数中 InitInstance(),打开主函数界面之前,启动UI线程
    为了让程序一起动就显示启动画面,这段代码应该放在InitInstance()最开头的地方.
BOOL CdemoApp::InitInstance()
{
	// 这里开始
	pSplashThread = (CSplashThread*)AfxBeginThread(
		RUNTIME_CLASS(CSplashThread),
		THREAD_PRIORITY_NORMAL,
		0, CREATE_SUSPENDED);

	ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
	pSplashThread->ResumeThread();

	Sleep(2000);
	// 这里结束
}

基于MFC的对话框程序添加启动画面_第13张图片

  1. 在需要关闭启动画面的地方添加如下函数,调用HideSplash:
// CTestStartBmpApp是主函数APP的名字
if ((( CdemoApp*)AfxGetApp())->pSplashThread != NULL)
    (( CdemoApp*)AfxGetApp())->pSplashThread->HideSplash();

基于MFC的对话框程序添加启动画面_第14张图片
运行效果:
基于MFC的对话框程序添加启动画面_第15张图片

你可能感兴趣的:(MFC,mfc,c++)