VC++工程中加入SplashScreen 原理释解,制作软件的显示界面
2007-03-18 00:35
567 查看
SplashScreen - 我们使用 Word 之类的软件在启动的短暂时间里就会看到它的身影。它通常用以在程序启动时显示程序及用户名称,版权信息等。我也不知道它准确的名称是什么(是闪屏吗?),就这样称呼吧。也许你也想在自己的工程里加入这样的特性,本文将以创建实际工程的方式逐步剖析其实现原理。
注意:为避免实际所使用工程名给类或对象名带来的干扰,除非特别说明,在本文中将使用基类名如CWinApp、CMainFrame、CDialog来代替实际工程中的相应派生类名进行描述。
Visual C++是一个相当强大的C++开发工具,它内嵌了对SplashScreen的支持。但是在MFC EXE类型工程中只是对带有主框架类的SDI或MDI工程提供了这一支持,基于对话框类的工程则被排除在外。现在让我们开始吧。第一步是在SDI工程中加入SplashScreen。
首先利用AppWizard生成一个SDI工程,除了其中Docking ToolBar必须选择外(我认为这是MFC的一个Bug,当然这与本文讨论的SplashScreen没有关系),其他的文档-视图支持、状态条之类的都可以不要,这样可以尽量减少无用的代码。
通过IDE中的菜单Project->Add to Project->Components and Controls,我们就可以从Visual C++ Components中选择Splash Screen这个组件插入工程。
在点击了"Insert"后会弹出一个如下图所示的对话框,这是设置插入该工程中的SplashScreen的类名、显示用位图的ID及文件名,采用缺省值即可。
通过以上几步的操作,就会在工程目录下生成Splash.CPP和Splash.H文件,这便是CSplashWnd类的实现文件与头文件。同时工程中CWinApp与CMainFrame类中的部分代码也会被修改,以实现CSplashWnd窗口的消息处理。
接着我们来看看 CSplashWnd 类的声明与主要的代码(已经过删减):
//类的声明
class CSplashWnd : public CWnd
//是否使用SplashScreen void CSplashWnd::EnableSplashScreen(BOOL bEnable)
//创建CsplashWnd对象,并调用Create()创建窗口 void CSplashWnd::ShowSplashScreen(CWnd* pParentWnd)
//装入SplashScreen欲显示位图,通过CreateEx()激发OnCreate()完成窗口创建与设置 BOOL CSplashWnd::Create(CWnd* pParentWnd)
//销毁窗口,刷新框架 void CSplashWnd::HideSplashScreen()
//利用窗口创建结构创建窗口,并设置定时器在750ms后触发OnTimer() int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
//将键盘和鼠标消息传递给CSplashWnd对象,以销毁窗口BOOL CSplashWnd::PreTranslateAppMessage(MSG* pMsg)
void CSplashWnd::OnTimer(UINT nIDEvent)
再看看CWinApp和CMainFrame类中发生了什么样的改变:
(1)在CWinApp::InitInstance()中调用CSplashWnd::EnableSplashScreen()设置c_bShowSplashWnd;
在PreTranslateMessage()中调用CSplashWnd::PreTranslateAppMessage(),将键盘和鼠标消息传递给CSplashWnd对象,从而进一步调用CSplashWnd::HideSplashScreen()实现SplashScreen窗口的自身销毁。
(2)在CMainFrame对象的OnCreate()中调用CSplashWnd::ShowSplashScreen()创建一个静态的SplashScreen窗口对象c_pSplashWnd,并设置其父窗口为CMainFrame。在这个过程中,CSplashWnd自身会通过创建来设置一个定时器,然后定时器在第一个周期触发时便调用HideSplashScreen()销毁自己。
(3) 而CMainFrame对象的窗口创建消息则是由CWinApp对象在InitInstance()中通过
m_pMainWnd->ShowWindow()调用触发的。
整个过程可以用下图表示,基本原理就是由CMainFrame来创建CSplashWnd,然后由CSplashWnd自己的定时器触发定时消息来销毁窗口。所以 CSplashWnd 的加入与SDI还是MDI都没有关系。
第二步,我们再来看看如何在基于对话框的工程中加入 SplashScreen。
通过对以上SDI工程中加入SplashScreen原理的剖析,我想大家也想到如何在基于对话框的工程中加入这一特性了。其实质就是由CDialog类完成SDI工程中CMainFrame类的工作,实现步骤如下:
(1)利用ClassWizard为CMyDialog添加WM_CREATE消息的处理函数OnCreate();(这里使用CMyDialog是为了与函数内的基类名CDialog区别。) int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CSplashWnd::ShowSplashScreen(this);
return 0;
}
(2)利用ClassWizard为CWinApp添加消息转发处理函数PreTranslateMessage(); BOOL CWinApp::PreTranslateMessage(MSG* pMsg)
{
if (CSplashWnd::PreTranslateAppMessage(pMsg))
return TRUE;
return CWinApp::PreTranslateMessage(pMsg);
}
(3)CWinApp::InitInstance()中加入如下调用: CSplashWnd::EnableSplashScreen(TRUE);
(4)当然你还需要将上一个SDI工程中生成的Splash.CPP与Splash.H文件拷贝到当前工程目录下,并利用Project->Add to Project->Files将这两个文件引入工程。同时还要在CWinApp与CMainFrame的实现文件中#include "Splash.H"。
(5)然后在资源管理器里添加一个ID为IDB_SPLASH的位图。由于VC++的IDE只能显示256色以下的位图,所以如果你想显示一幅真彩色的位图,就请用Import方式导入一幅预先制作好的位图。当然VC++会提示位图已经成功导入,只是无法在IDE的位图编辑器中显示,而在程序运行时就会显示了。如果你想象Word那样显示用户名等信息,可以在CSplashWnd::Create()中装载位图之后增加自己的代码来修改位图。
注意:为避免实际所使用工程名给类或对象名带来的干扰,除非特别说明,在本文中将使用基类名如CWinApp、CMainFrame、CDialog来代替实际工程中的相应派生类名进行描述。
Visual C++是一个相当强大的C++开发工具,它内嵌了对SplashScreen的支持。但是在MFC EXE类型工程中只是对带有主框架类的SDI或MDI工程提供了这一支持,基于对话框类的工程则被排除在外。现在让我们开始吧。第一步是在SDI工程中加入SplashScreen。
首先利用AppWizard生成一个SDI工程,除了其中Docking ToolBar必须选择外(我认为这是MFC的一个Bug,当然这与本文讨论的SplashScreen没有关系),其他的文档-视图支持、状态条之类的都可以不要,这样可以尽量减少无用的代码。
通过IDE中的菜单Project->Add to Project->Components and Controls,我们就可以从Visual C++ Components中选择Splash Screen这个组件插入工程。
在点击了"Insert"后会弹出一个如下图所示的对话框,这是设置插入该工程中的SplashScreen的类名、显示用位图的ID及文件名,采用缺省值即可。
通过以上几步的操作,就会在工程目录下生成Splash.CPP和Splash.H文件,这便是CSplashWnd类的实现文件与头文件。同时工程中CWinApp与CMainFrame类中的部分代码也会被修改,以实现CSplashWnd窗口的消息处理。
接着我们来看看 CSplashWnd 类的声明与主要的代码(已经过删减):
//类的声明
class CSplashWnd : public CWnd
//是否使用SplashScreen void CSplashWnd::EnableSplashScreen(BOOL bEnable)
//创建CsplashWnd对象,并调用Create()创建窗口 void CSplashWnd::ShowSplashScreen(CWnd* pParentWnd)
//装入SplashScreen欲显示位图,通过CreateEx()激发OnCreate()完成窗口创建与设置 BOOL CSplashWnd::Create(CWnd* pParentWnd)
//销毁窗口,刷新框架 void CSplashWnd::HideSplashScreen()
//利用窗口创建结构创建窗口,并设置定时器在750ms后触发OnTimer() int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
//将键盘和鼠标消息传递给CSplashWnd对象,以销毁窗口BOOL CSplashWnd::PreTranslateAppMessage(MSG* pMsg)
void CSplashWnd::OnTimer(UINT nIDEvent)
再看看CWinApp和CMainFrame类中发生了什么样的改变:
(1)在CWinApp::InitInstance()中调用CSplashWnd::EnableSplashScreen()设置c_bShowSplashWnd;
在PreTranslateMessage()中调用CSplashWnd::PreTranslateAppMessage(),将键盘和鼠标消息传递给CSplashWnd对象,从而进一步调用CSplashWnd::HideSplashScreen()实现SplashScreen窗口的自身销毁。
(2)在CMainFrame对象的OnCreate()中调用CSplashWnd::ShowSplashScreen()创建一个静态的SplashScreen窗口对象c_pSplashWnd,并设置其父窗口为CMainFrame。在这个过程中,CSplashWnd自身会通过创建来设置一个定时器,然后定时器在第一个周期触发时便调用HideSplashScreen()销毁自己。
(3) 而CMainFrame对象的窗口创建消息则是由CWinApp对象在InitInstance()中通过
m_pMainWnd->ShowWindow()调用触发的。
整个过程可以用下图表示,基本原理就是由CMainFrame来创建CSplashWnd,然后由CSplashWnd自己的定时器触发定时消息来销毁窗口。所以 CSplashWnd 的加入与SDI还是MDI都没有关系。
第二步,我们再来看看如何在基于对话框的工程中加入 SplashScreen。
通过对以上SDI工程中加入SplashScreen原理的剖析,我想大家也想到如何在基于对话框的工程中加入这一特性了。其实质就是由CDialog类完成SDI工程中CMainFrame类的工作,实现步骤如下:
(1)利用ClassWizard为CMyDialog添加WM_CREATE消息的处理函数OnCreate();(这里使用CMyDialog是为了与函数内的基类名CDialog区别。) int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CSplashWnd::ShowSplashScreen(this);
return 0;
}
(2)利用ClassWizard为CWinApp添加消息转发处理函数PreTranslateMessage(); BOOL CWinApp::PreTranslateMessage(MSG* pMsg)
{
if (CSplashWnd::PreTranslateAppMessage(pMsg))
return TRUE;
return CWinApp::PreTranslateMessage(pMsg);
}
(3)CWinApp::InitInstance()中加入如下调用: CSplashWnd::EnableSplashScreen(TRUE);
(4)当然你还需要将上一个SDI工程中生成的Splash.CPP与Splash.H文件拷贝到当前工程目录下,并利用Project->Add to Project->Files将这两个文件引入工程。同时还要在CWinApp与CMainFrame的实现文件中#include "Splash.H"。
(5)然后在资源管理器里添加一个ID为IDB_SPLASH的位图。由于VC++的IDE只能显示256色以下的位图,所以如果你想显示一幅真彩色的位图,就请用Import方式导入一幅预先制作好的位图。当然VC++会提示位图已经成功导入,只是无法在IDE的位图编辑器中显示,而在程序运行时就会显示了。如果你想象Word那样显示用户名等信息,可以在CSplashWnd::Create()中装载位图之后增加自己的代码来修改位图。
相关文章推荐
- VC2010工程中加入SplashScreen及原理释解
- VC++2010工程中加入SplashScreen
- VC2010 MFC程序制作Flash动画欢迎界面
- 关于游戏软件制作的工艺与工程(3)
- 解决android开发中Manifest加入网络权限后显示不出界面的问题
- 请问如何制作中国象棋对弈软件的界面部分?
- 如何在已有的VC++工程中使用BCG界面库?
- 让你的软件界面更漂亮 (VC)
- BCG界面库在VC工程中的应用步骤
- 解决自动安装evaQQ软件不显示中文界面问题
- 【软件工程基础】个人数独项目介绍及制作流程
- PCB MATRIX IPC软件制作封装时不显示焊盘的解决办法
- 在《Android PorterDuff.Mode图形混合处理 》这篇博客中,我们讲解了PorterDuff.Mode对图形混合的处理。这篇我们将通过图形混合的原理,来制作一个手动擦除蒙版显示底层图片
- 三维显示软件制作---文件读入部分
- 使用qooxdoo轻松制作超酷软件界面
- 用VC++制作QQ自动登陆软件
- Docker容器图形界面显示(运行GUI软件)的配置方法
- 用VC纯资源dll制作多语言界面程序
- 关于游戏软件制作的工艺与工程(3)
- BCG界面库在VC工程中的应用步骤