您的位置:首页 > 其它

VS2008中添加程序启动时显示图片功能方法

2016-09-25 21:29 501 查看
在VC6.0中,可以通过添加Splash组件,然后在工程调用组件中提供的函数,就可以实现。但是在VS2008中却没有这样的组件(我自己找了好久,没找到,网上查阅也没有相关资料)。在查阅了相关资料后总结如下



1、需要自己添加一个专门的类CSplashWnd。

代码如下:

//////////////////////////////////////////////////////////////////////////////SplashWnd.h

#ifndef _SPLASH_HEADER_

#define_SPLASH_HEADER_

#pragmaonce

//#include"afxwin.h"

//CSplashWnd

classCSplashWnd:publicCWnd

{

//DECLARE_DYNAMIC(CSplashWnd)

public:

CSplashWnd();

virtual~CSplashWnd();

virtualvoidPostNcDestroy();

public:

CBitmap m_bitmap;

protected:

staticBOOLc_bShowSplashWnd;

staticCSplashWnd*c_pSplashWnd;

public:

staticvoidEnableSplashScreen(BOOLbEnable=TRUE);

staticvoidShowSplashScreen(CWnd*pParentWnd=NULL);

staticBOOLPreTranslateAppMessage(MSG*pMsg);

protected:

BOOL Create(CWnd*pParentWnd=NULL);

voidHideSplashScreen();

afx_msg
intOnCreate(LPCREATESTRUCTlpCreateStruct);

afx_msg
voidOnPaint();

afx_msg
voidOnTimer(UINTnIDEvent);

protected:

DECLARE_MESSAGE_MAP()

};

#endif

///////////////////////////////////////////////////////////////////SplashWnd.cpp

//SplashWnd.cpp:
实现文件

//

#include
"stdafx.h"

#include
"resource.h"

#include
"SplashWnd.h"

//CSplashWnd

//IMPLEMENT_DYNAMIC(CSplashWnd,CWnd)

BOOL CSplashWnd::c_bShowSplashWnd
=FALSE;

CSplashWnd*CSplashWnd::c_pSplashWnd;

CSplashWnd::CSplashWnd()

{

}

CSplashWnd::~CSplashWnd()

{

//Clear thestatic window pointer.

ASSERT(c_pSplashWnd==this);

c_pSplashWnd
=NULL;

}

BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)

ON_WM_CREATE()

ON_WM_PAINT()

ON_WM_TIMER()

END_MESSAGE_MAP()

voidCSplashWnd::EnableSplashScreen(BOOLbEnable)

{

c_bShowSplashWnd
=bEnable;

}

voidCSplashWnd::ShowSplashScreen(CWnd*pParentWnd)

{

if(!c_bShowSplashWnd||c_pSplashWnd!=NULL)

return;

//Allocate a newsplash screen, and create the window.

c_pSplashWnd=newCSplashWnd;

if(!c_pSplashWnd->Create(pParentWnd))

delete c_pSplashWnd;

else

c_pSplashWnd->UpdateWindow();

}

BOOL CSplashWnd::PreTranslateAppMessage(MSG*pMsg)

{

if(c_pSplashWnd==NULL)

returnFALSE;

//Ifwe get a keyboard or mouse message, hide the
splashscreen.

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==WM_NCRBUTTONDOWN||

pMsg->message==WM_NCMBUTTONDOWN)

{

c_pSplashWnd->HideSplashScreen();

returnTRUE;//messagehandled
here

}

returnFALSE;//message
nothandled

}

BOOL CSplashWnd::Create(CWnd*pParentWnd)

{

if(!m_bitmap.LoadBitmap(IDB_SPLASH))

returnFALSE;

BITMAP bm;

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()

{

//Destroy thewindow, and update the mainframe.

DestroyWindow();

AfxGetMainWnd()->UpdateWindow();

}

voidCSplashWnd::PostNcDestroy()

{

//Free the C++class.

deletethis;

}

intCSplashWnd::OnCreate(LPCREATESTRUCTlpCreateStruct)

{

if(CWnd::OnCreate(lpCreateStruct)==-1)

return-1;

//Center thewindow.

CenterWindow();

//Set a timer todestroy the splash screen.

SetTimer(1,1000,NULL);

return0;

}

voidCSplashWnd::OnPaint()

{

CPaintDC dc(this);

CDC dcImage;

if(!dcImage.CreateCompatibleDC(&dc))

return;

BITMAP bm;

m_bitmap.GetBitmap(&bm);

//Paint theimage.

CBitmap*pOldBitmap=dcImage.SelectObject(&m_bitmap);

dc.BitBlt(0,0,bm.bmWidth,
bm.bmHeight,
&dcImage,0,0,SRCCOPY);

dcImage.SelectObject(pOldBitmap);

}

voidCSplashWnd::OnTimer(UINTnIDEvent)

{

//Destroy thesplash screen window.

HideSplashScreen();

}

////////////////////////////////////////////////////////////////////////////////////

2、在App主程序实现代码中把上面的头文件包含进去,并在InitInstance函数中添加下面一段代码

CCommandLineInfocmdInfo;

ParseCommandLine(cmdInfo);

CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash);

【注意】 CCommandLineInfo
cmdInfo; ParseCommandLine(cmdInfo);这两句代码已经在InitInstance函数中存在,只需将最后一句代码加上即可。

3、最后,在主框架窗口实现代码中包含Splash头文件,在OnCreate函数return前调用CSplashWnd类的ShowSplashScreen函数即可。

//显示Splash窗口

CSplashWnd::ShowSplashScreen(this)

4、按照上面的顺序不能完成此功能,原因如下:

08中MFC中的InitInstance函数,默认的代码大致是:

// 创建主 MDI 框架窗口
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;

// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

即默认是先建立框架,再解析命令行。也就是限执行MainFrame里面的OnCreate函数里面中的3,再执行2。在里面跟踪一下,就会发现,这样就无法满足执行条件而无法完成功能。

5、这里面的图片是需要先将文件中的图片导入资源中,【提醒】只能导入BMP图像,如果不是,可以先用Photoshop处理下。【特别提醒】导入的BMP的大小要有限制,Photoshop里面也有调节图像大小功能,
一般像素宽度和高度大于700多(经验值,具体可以自己实验下),调用系统函数加载图像时,就会失败。
m_bitmap.LoadBitmap(IDB_SPLASH)

以上为个人使用经验之谈,如有不足,请留言指正!

此文章来自于【https://my.oschina.net/tjguo/blog/12742】或【http://blog.sina.com.cn/s/blog_4bf793ad0100omn6.html】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息