在VC++中制作启动屏幕的新方法文档格式.docx
《在VC++中制作启动屏幕的新方法文档格式.docx》由会员分享,可在线阅读,更多相关《在VC++中制作启动屏幕的新方法文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
//设置启动窗口背景,在整个窗口中充满位图
CRectlRect;
m_pic.GetClientRect(&
lRect);
//得到Picture控件的窗口大小
lRect.NormalizeRect();
//设置位图句柄
HBITMAPhbitmap=(HBITMAP)LoadImage(NULL,"
splash.bmp"
//更改你喜欢的位图文件
IMAGE_BITMAP,lRect.Width(),lRect.Height(),
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_pic.SetBitmap(hbitmap);
//设置定时器
SetTimer(1,500,NULL);
returnTRUE;
}
7.在OnTimer(UINTnIDEvent)函数中添加代码如下:
voidCSplash:
OnTimer(UINTnIDEvent)
{
staticinti;
i++;
if(i>
3)
{
//销毁定时器
KillTimer
(1);
this->
OnOK();
}
OnTimer(nIDEvent);
8.在OnLButtonUp,OnLButtonUp,OnLButtonUp,OnChar函数中加入以下代码:
KillTimer
(1);
this->
9.在MySample.Cpp中引入头文件
#include"
Splash.h"
在InitInstance()函数中加入代码:
BOOLCMySampleApp:
InitInstance()
…
AfxEnableControlContainer();
CSplashsplash;
splash.DoModal();
…
至此,启动屏幕就Ok了!
VC++工程中加入SplashScreen
摘要
本文旨在剖析VC++工程中加入SplashScreen的原理,并给出在VC++MFC(exe)工程中加入SplashScreen的步骤。
关键字SplashScreen,原理
环境:
Windows98SE/2000,VC++6.0
SplashScreen-我们使用Word之类的软件在启动的短暂时间里就会看到它的身影。
它通常用以在程序启动时显示程序及用户名称,版权信息等。
我也不知道它准确的名称是什么(是闪屏吗?
),就这样称呼吧。
也许你也想在自己的工程里加入这样的特性,本文将以创建实际工程的方式逐步剖析其实现原理。
注意:
为避免实际所使用工程名给类或对象名带来的干扰,除非特别说明,在本文中将使用基类名如CWinApp、CMainFrame、CDialog来代替实际工程中的相应派生类名进行描述。
VisualC++是一个相当强大的C++开发工具,它内嵌了对SplashScreen的支持。
但是在MFCEXE类型工程中只是对带有主框架类的SDI或MDI工程提供了这一支持,基于对话框类的工程则被排除在外。
现在让我们开始吧。
第一步是在SDI工程中加入SplashScreen。
首先利用AppWizard生成一个SDI工程,除了其中DockingToolBar必须选择外(我认为这是MFC的一个Bug,当然这与本文讨论的SplashScreen没有关系),其他的文档-视图支持、状态条之类的都可以不要,这样可以尽量减少无用的代码。
通过IDE中的菜单Project->
AddtoProject->
ComponentsandControls,我们就可以从VisualC++Components中选择SplashScreen这个组件插入工程。
在点击了"
Insert"
后会弹出一个如下图所示的对话框,这是设置插入该工程中的SplashScreen的类名、显示用位图的ID及文件名,采用缺省值即可。
通过以上几步的操作,就会在工程目录下生成Splash.CPP和Splash.H文件,这便是CSplashWnd类的实现文件与头文件。
同时工程中CWinApp与CMainFrame类中的部分代码也会被修改,以实现CSplashWnd窗口的消息处理。
接着我们来看看CSplashWnd类的声明与主要的代码(已经过删减):
//类的声明
classCSplashWnd:
publicCWnd
CSplashWnd();
~CSplashWnd();
virtualvoidPostNcDestroy();
staticvoidEnableSplashScreen(BOOLbEnable=TRUE);
staticvoidShowSplashScreen(CWnd*pParentWnd=NULL);
staticBOOLPreTranslateAppMessage(MSG*pMsg);
BOOLCreate(CWnd*pParentWnd=NULL);
voidHideSplashScreen();
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnPaint();
afx_msgvoidOnTimer(UINTnIDEvent);
CBitmapm_bitmap;
//SplashScreen窗口显示用的位图对象
staticBOOLc_bShowSplashWnd;
//是否要显示SplashScreen的标志量
staticCSplashWnd*c_pSplashWnd;
};
//是否使用SplashScreen
voidCSplashWnd:
EnableSplashScreen(BOOLbEnable)
c_bShowSplashWnd=bEnable;
}
//创建CsplashWnd对象,并调用Create()创建窗口
ShowSplashScreen(CWnd*pParentWnd)
//如果不要显示SplashScreen或SplashWnd对象已经被创建则返回
if(!
c_bShowSplashWnd||c_pSplashWnd!
=NULL)
return;
c_pSplashWnd=newCSplashWnd;
c_pSplashWnd->
Create(pParentWnd))
deletec_pSplashWnd;
else
c_pSplashWnd->
UpdateWindow();
//装入SplashScreen欲显示位图,通过CreateEx()激发OnCreate()完成窗口创建与设置
BOOLCSplashWnd:
Create(CWnd*pParentWnd)
m_bitmap.LoadBitmap(IDB_SPLASH))
returnFALSE;
BITMAPbm;
m_bitmap.GetBitmap(&
bm);
returnCreateEx(0,
AfxRegisterWndClass(0,AfxGetApp()->
LoadStandardCursor(IDC_ARROW)),
NULL,
WS_POPUP|WS_VISIBLE,
0,
bm.bmWidth,
bm.bmHeight,
pParentWnd->
GetSafeHwnd(),
NULL);
//销毁窗口,刷新框架
HideSplashScreen()
DestroyWindow();
AfxGetMainWnd()->
//利用窗口创建结构创建窗口,并设置定时器在750ms后触发OnTimer()
intCSplashWnd:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CWnd:
OnCreate(lpCreateStruct)==-1)
return-1;
CenterWindow();
//窗口居中显示
SetTimer(1,750,NULL);
//设置定时器
return0;
//将键盘和鼠标消息传递给CSplashWnd对象,以销毁窗口
PreTranslateAppMessage(MSG*pMsg)
if(c_pSplashWnd==NULL)
if(pMsg->
message==WM_KEYDOWN||
pMsg->
message==WM_SYSKEYDOWN||
message==WM_LBUTTONDOWN||
message==WM_RBUTTONDOWN||
message==WM_MBUTTONDOWN||
message==WM_NCLBUTTONDOWN||
message==W