在VC++中制作启动屏幕的新方法.docx
《在VC++中制作启动屏幕的新方法.docx》由会员分享,可在线阅读,更多相关《在VC++中制作启动屏幕的新方法.docx(8页珍藏版)》请在冰豆网上搜索。
![在VC++中制作启动屏幕的新方法.docx](https://file1.bdocx.com/fileroot1/2022-10/29/d567b6c9-d8b9-4f28-9d99-324686ffeead/d567b6c9-d8b9-4f28-9d99-324686ffeead1.gif)
在VC++中制作启动屏幕的新方法
在VC++.net中制作启动屏幕的新方法
在利用VC++.net编程过程中,遇到制作启动屏幕的问题,几经试验,得出一种方便简单的制作方法。
基本原理是利用对话框窗口的特性,在启动时首先创建对话框,设置一个获得位图文件的句柄,利用Picture控件的SetBitmap(HBITMAPhBitmap)方法,使位图文件充满整个Picture控件窗口,最后设置定时器,整个启动屏幕就制作完成。
下面介绍具体实现步骤。
1.打开VS.net的开发环境,新建VC++.net中的MFC应用程序,输入工程名称MySample,点击“确定”,“完成”;
2.打开资源视图,添加对话框,更改ID为ID_DIALOG_SPLASH,设置对话框Center属性为True,Border属性为“无”;
3.在对话框中添加Picture控件,设置Picture控件的ID号为ID_PIC,Type属性为“位图”,Centerimage属性为True,然后调整标尺使对话框没有外框,调整对话框的大小以适应启动屏幕的要求,调整Picture的宽高使其充满整个对话框窗口;
4.双击对话框窗口,弹出类向导对话框,在类名中键入CSplash,选择基类为Cdialog,点击确定,定义控件Picture的控件变量为m_pic;
5.在Csplash类中重载OnInitDialog()函数,添加消息WM_CHAR,WM_TIMER,WM_LBUTTONUP,WM_MBUTTONUP,WM_RBUTTONUP;
6.在OnInitDialog()函数中添加代码如下:
BOOLCSplash:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//设置启动窗口背景,在整个窗口中充满位图
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();
}
CDialog:
:
OnTimer(nIDEvent);
}
8.在OnLButtonUp,OnLButtonUp,OnLButtonUp,OnChar函数中加入以下代码:
{
KillTimer
(1);
this->OnOK();
}
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()创建窗口
voidCSplashWnd:
:
ShowSplashScreen(CWnd*pParentWnd)
{
//如果不要显示SplashScreen或SplashWnd对象已经被创建则返回
if(!
c_bShowSplashWnd||c_pSplashWnd!
=NULL)
return;
c_pSplashWnd=newCSplashWnd;
if(!
c_pSplashWnd->Create(pParentWnd))
deletec_pSplashWnd;
else
c_pSplashWnd->UpdateWindow();
}
//装入SplashScreen欲显示位图,通过CreateEx()激发OnCreate()完成窗口创建与设置
BOOLCSplashWnd:
:
Create(CWnd*pParentWnd)
{
if(!
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,
0,
bm.bmWidth,
bm.bmHeight,
pParentWnd->GetSafeHwnd(),
NULL);
}
//销毁窗口,刷新框架
voidCSplashWnd:
:
HideSplashScreen()
{
DestroyWindow();
AfxGetMainWnd()->UpdateWindow();
}
//利用窗口创建结构创建窗口,并设置定时器在750ms后触发OnTimer()
intCSplashWnd:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
CenterWindow();//窗口居中显示
SetTimer(1,750,NULL);//设置定时器
return0;
}
//将键盘和鼠标消息传递给CSplashWnd对象,以销毁窗口
BOOLCSplashWnd:
:
PreTranslateAppMessage(MSG*pMsg)
{
if(c_pSplashWnd==NULL)
returnFALSE;
if(pMsg->message==WM_KEYDOWN||
pMsg->message==WM_SYSKEYDOWN||
pMsg->message==WM_LBUTTONDOWN||
pMsg->message==WM_RBUTTONDOWN||
pMsg->message==WM_MBUTTONDOWN||
pMsg->message==WM_NCLBUTTONDOWN||
pMsg->message==W