MFC对话框程序:实现程序启动画面

对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等。那么对于基于对话框的程序如何实现了?

因为显示启动画面的同时还要进行程序的加载工作,所以要用到多线程。MFC区分了两种不同类型的多线程:用户界面(UI)线程和工作者线程。两者的区别是UI线程有消息循环,而工作者线程没有,UI线程能够创建窗口并处理发送给窗口的消息。工作者线程用来执行后台任务,这些后台任务不直接接受用户输入,因此不需要窗口和消息循环。 因为这里要显示一个画面,所以要使用UI线程。http://blog.sina.com.cn/s/blog_63a881060102w01h.html

一、准备阶段

具体的操作方法如下:

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

2、在资源管理器中插入一个新的对话框和一张位图,ID设置为IDD_SPLASH,在上面一个picture控件,类型设为”Bitmap”,图象选择刚才插入的位图。如下:

设置对话框的Style为Popup,Border为None,去掉TitleBar属性,并调整对话框的大小与位图等大,这样对话框显示的时候,你看到的只是图片。

3、右键界面,点击‘添加类”,建立一个新类CSplashDlg,基类为CDialog。

4、接下来创建一个UI线程。使用快捷键Ctrl+shift+X 打开类向导,点击最上面右边的添加类旁边的小三角,选择“MFC类”,类名叫CSplashThread,基类是CWinThread。如下图:

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

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

在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;
}

为CSplashThread类添加一个函数 HideSplash() , 用来隐藏启动画面(即关闭对话框)

void CSplashThread::HideSplash()
{
m_pSplashDlg->SendMessage(WM_CLOSE);
}

在主函数创建完之后是需要把这个界面给影藏掉的,或者销毁掉,所以在线程退出函数哪里写上如下代码:

int CSplashThread::ExitInstance()
{
// TODO: 在此执行任意逐线程清理
m_pSplashDlg->DestroyWindow();
if (m_pSplashDlg != NULL)
{
delete m_pSplashDlg;
}
return CWinThread::ExitInstance();
}

二、开始使用

1、在应用程序进入的地方,也就是本项目的 CTestStartBmpApp(也就是TestStartBmp.h)的初始化函数中。

引入上面生成的两个文件,并在public中添加两个变量,如下:

#include "resource.h"		// 主符号
#include "SplashThread.h" class CTestStartBmpApp : public CWinApp
{
public:
...
CSplashThread* pSplashThread;
CSplashDlg* m_pSplashDlg;
...
}

在初始化函数中 InitInstance(),打开主函数界面之前,启动UI线程

...
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
// 这里开始
pSplashThread = (CSplashThread*)AfxBeginThread(
RUNTIME_CLASS(CSplashThread),
THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED); ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
pSplashThread->ResumeThread(); Sleep(10); // 这里结束
CTestStartBmpDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
...

之后再需要关闭启动画面的地方添加如下函数,调用HideSplash:

// CTestStartBmpApp是主函数APP的名字
if (((CTestStartBmpApp*)AfxGetApp())->pSplashThread != NULL)
((CTestStartBmpApp*)AfxGetApp())->pSplashThread->HideSplash();

至此就完成了启动图片的功能,效果图如下:


醉里挑灯看剑,梦回吹角连营,八百里分麾下炙,五十弦翻塞外声,沙场秋点兵!

MFC对话框程序:实现程序启动画面的更多相关文章

  1. 为你的Web程序加个启动画面

    .Net开发者一定熟悉下面这个画面: 这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window).同样,Javar们一定对Eclip ...

  2. ios 应用程序图标、启动画面、itune图标设置

    http://blog.sina.com.cn/s/blog_4cd8dd1301014hfz.html 先说说应用程序图标,一般有下面几种: Icon.png(57x57) - Homescreen ...

  3. XE7 - 程序图标及启动画面图片的注意事项

    还是继续昨晚写的,年前已经解决了这个问题,现在补记下.启动画面失真是本篇笔记的重点.搜索了很多文章,基本上大同小异,几乎都没怎么提及启动画面失真的问题.不知道是不是我的操作不对头,. Project ...

  4. QSplashScreen类实现Qt程序启动画面

      QSplashScreen类实现Qt程序启动画面 收藏人:zwsj     2013-09-13 | 阅:569  转:6    |   来源   |  分享               程序启动 ...

  5. MFC之窗体改动工具栏编程状态栏编程程序启动画面

    1窗体外观的改动 (1)改动在CMainFrame::preCreateWindow(CREATESTRUCT& cs) 改动标题:cs.style&=FWS_ADDTOTITLE; ...

  6. 【VC编程技巧】窗口☞3.5对单文档或者多文档程序制作启动画面

    (一)概要: 文章描写叙述了如何通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于 ...

  7. VC++编程中为程序加入启动画面功能

     如何为自己的程序加入启动画面 观察我们平常使用的软件,当我们双击软件的时候,会在主界面出现前,先行出现一个启动画面,由于前一阵子写了一个基于对话框的程序,亲自实验了下,今天就为大家简单的介绍下,在我 ...

  8. 用VC制作应用程序启动画面

    摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢 ...

  9. Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少. 比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找 ...

  10. QT之实现程序启动画面

    现在好多软件都有,尤其是大型软件,他们要加载的东西太多,因此需要的事件较长,而又不希望给用户产生成为好像没有响应的情况,因此也就需要程序启动画面来实现. 当然了,用widget要比这个丰富很多,不过代 ...

随机推荐

  1. WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理

    1.官网下载并配置 下载MinIO Serve地址(不需要安装,放在目录就行) https://dl.min.io/server/minio/release/windows-amd64/minio.e ...

  2. LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]

    LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning.Lora.Prefix tuing等] 由于LLM参数量都是在亿级以上,少则数十亿,多则 ...

  3. 简单的解释下什么是CNAME

    今天在用阿里云的安全防护给接口域名做web应用防火墙,需要配置cname,原来有用到过但是一直没去了解过,只知道怎么用今天搜了一下看看下面是原文,白话文好理解分享一下. 什么是CNAME?先简单的说下 ...

  4. 实验五:FTP远程密码pojie(有敏感词)

    [实验目的] 了解远程FTP密码pojie原理,了解如何有效防范类似攻击的方法和措施,掌握pojieftp帐号口令pojie技术的基本原理.常用方法及相关工具. [知识点] FTP口令pojie [实 ...

  5. WatchDog:一款.NET开源的实时应用监控系统

    项目介绍 WatchDog是一个开源(MIT License).免费.针对ASP.Net Core Web应用程序和API的实时应用监控系统.开发者可以实时记录和查看他们的应用程序中的消息.事件.HT ...

  6. 看李沐的 ViT 串讲

    ViT 概括 论文题目:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 论文地址:https:// ...

  7. Mysql 使用(一)

    一.数据库的种类 关系型数据库 非关系型数据库 二.常见关系型数据库 oracle:在以前的大型项目中使用,银行,电信等项目 mysql:web时代使用最广泛的关系型数据库 ms sql server ...

  8. Linux设备模型:5、device和device driver

    作者:wowo 发布于:2014-4-2 19:28 分类:统一设备模型 http://www.wowotech.net/device_model/device_and_driver.html 前言 ...

  9. ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH

    打包程序为BOOT.BIN 注意,做好备份是一个好习惯. Vivado Vivado 添加QSPI Flash的IP,重新编译: Launch SDK(推荐方法):或者用SDK指定一个workspac ...

  10. 《HelloGitHub》第 99 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...