如何用VC++ 5.0制作应用程序真彩色启动封面 利用Visual C++的组件库中的Splash Screen组件可以很方便的在应用程序中实现Splash Screen。但是由于这个组件缺省时使用16色位图,因此很多人误认为这个组件仅支持16色位图。其实,这个组件是可以支持真彩色位图的。 1.制作封面位图、开始音乐等资源文件 制作应用程序启动封面真彩位图,建立所需要播放的声音文件等。 2.在资源中插入位图资源 打开VC++的资源编辑器,用鼠标右键单击Resources文件夹,选择Import命令,插入你所制作的真彩位图。这时VC++会弹出一个对话框,显示下列信息: “The bitmap has been imported correctly, however because it contains more than 256 colors it cannot be loaded in the bitmap editor”。 不用担心,你的真彩位图已经被成功地插入资源里了。将其ID改为IDB_SPLASH。 3.插入Splash Screen组件 从Project菜单选择Add To Project->Components and Controls...命令,选择Developer studio components中的Splash screen组件,将对话框中的位图资源ID改为你的真彩位图的ID。然后删除VC++自动加入到资源中的缺省16色启动封面位图(可选)。编译、连接,漂亮的真彩启动封面就显示出来了。 4.增强功能 *基于对话框的应用程序 基于对话框的应用程序不能插入Splash Screen组件。利用下面的方法可以实现基于对话框的应用程序启动画面:重复上面的第1,2步骤,将已经生成的Splash.cpp和Splash.h文件(可以使用其他项目的文件)拷贝到工作文件夹,并将其加入到你的基于对话框的项目中(使用Project菜单下的Add To Project->Files...命令)。 在CWinApp派生类的InitInstance()中加入下列代码: #include "Splash.h" BOOL CDialogsplApp::InitInstance() { // CG: The following block was added by the Splash Screen component. { CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash); } ...... } 使用Class Wizard为在CDialog派生类添加OnCreate()函数,并加入下列代码: #include "Splash.h" int CDialogsplDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // CG: The following line was added by the Splash Screen component. CSplashWnd::ShowSplashScreen(this); return 0; } 最后将Splash.cpp文件中的CSplashWnd::Create()函数中的位图资源ID改为真彩位图的ID就可以了。 BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/) { if (!m_bitmap.LoadBitmap(IDB_BITMAP1)) return FALSE; ...... } *播放音乐 在MainFrm.cpp文件的开始部分加入下列语句: #include "mmsystem.h"//多媒体 #pragma comment(lib,"winmm.lib")//多媒体 在CMainFrame::OnCreate()函数中的ShowSplashScreen之后加入下列语句即可: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ...... // CG: The following line was added by the Splash Screen component. CSplashWnd::ShowSplashScreen(this); BOOL r = sndPlaySound("start.wav",SND_ASYNC|SND_NODEFAULT);//播放WAV文件 ASSERT(r); Sleep(4500); r = sndPlaySound("",SND_ASYNC|SND_NODEFAULT);//停止播放 return 0; }
然后把里面的资源改为自己的图片
3.导入软件封面的位图资源,标识号为IDB_SPLASH;
4.向CSplashWnd类中添加函数DrawText,在软件封面中显示文字。代码如下:
void CSplashWnd::DrawText(CDC *pDC, int x, int y, int nAlign,
CString sFontName, int nFONTSIZE0,COLORREF crTextColor, CString sText)
{ //pDC:内存dc,x,y:文字位置,nAlign:对齐方式
//sFont:字体,nFONTSIZE0:字号,crTextColor:文字颜色,sText:正文
LOGFONT lf;//字体
lf.lfStrikeOut=0;//删除线
lf.lfCharSet = DEFAULT_CHARSET ;//字符集
lf.lfEscapement =0;//角度
lf.lfItalic = 0 ;//倾斜
lf.lfUnderline = 0 ;//下划线
lf.lfHeight = nFONTSIZE0 ;//字号
strcpy(lf.lfFaceName,sFaceName.GetBuffer(sFontName.GetLength()));
CFont font ;
font.CreateFontIndirect(&lf);
CFont *pOldFont = (CFont *)pDC->SelectObject(&font);
UINT oldAlign,uAlign ;
switch(nAlign)
{
case 0: uAlign = TA_LEFT | TA_TOP ; break;
case 1: uAlign = TA_CENTER | TA_TOP; break;
case 2: uAlign = TA_RIGHT | TA_TOP ; break;
default: uAlign = TA_LEFT | TA_TOP ; break;
}
oldAlign = pDC->SetTextAlign(uAlign);
int oldMode = pDC->SetBkMode(TRANSPARENT);
int oldColor = pDC->SetTextColor(crTextColor) ;
pDC->TextOut(x,y,sText);pDC->SetTextColor(oldColor) ;
pDC->SetTextAlign(oldAlign);
pDC->SetBkMode(oldMode);
pDC->SelectObject(pOldFont);
font.DeleteObject();
}
5. 给CSplashWnd类中添加以下变量,并在构造函数中加入初始化代码;
class CSplashWnd : public CWnd
{public: CDC m_dcText,m_dcImage;//显示dc的兼容内存dc
CBitmap* m_pBitmap;//位图对象指针
CBitmap* m_pOldBitmapText,*m_pOldBitmap;//跟踪内存dc中的原位图
CRgn m_rgn;//用于生成矩形区域
CRect m_TextRect ;//显示文字的矩形区域
int m_nCurPos ;//文字当前位置
}
CSplashWnd::CSplashWnd()
{ m_nCurPos = 50 ;
}
6.设置显示文字的矩形区域。
BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
{ m_TextRect.CopyRect(&CRect(50,100,500,300));
}
7.添加 WM_PAINT消息处理函数,调用CSplashWnd::DrawText显示文字。
void CSplashWnd::OnPaint()
{ CPaintDC dc(this);
BITMAP bm;
m_bitmap.GetBitmap(&bm);
static BOOL bFirst = TRUE;//指示是否第一次绘制窗口
if(bFirst)
{ if (!m_dcImage.CreateCompatibleDC(&dc)) return;
m_pOldBitmap = m_dcImage.SelectObject(&m_bitmap);
if (!m_dcText.CreateCompatibleDC(&dc)) return;
m_pBitmap = new CBitmap ;
int nBitCount = m_dcText.GetDeviceCaps(BITSPIXEL);
m_pBitmap->CreateBitmap(bm.bmWidth,bm.bmHeight,1,nBitCount,NULL);
m_pOldBitmapText = m_dcText.SelectObject(m_pBitmap);
m_rgn.CreateRectRgn(m_TextRect.left,m_TextRect.top,
m_TextRect.right,m_TextRect.bottom);
bFirst = FALSE;
}
m_dcText.SelectClipRgn(NULL);
m_dcText.BitBlt(0, 0, bm.bmWidth, bm.bmHeight,&m_dcImage, 0, 0, SRCCOPY);
m_dcText.SelectClipRgn(&m_rgn);
int nBasex = m_TextRect.left ;
int nBasey = m_TextRect.bottom-m_nCurPos;
int nMidx = m_TextRect.left + m_TextRect.Width()/2 ;
DrawText(&m_dcText,nMidx,nBasey, 1,
"楷体_GB2312",20, RGB(0,0,255) ,"研制单位");
DrawText(&m_dcText,nMidx,nBasey+30, 1,
"楷体_GB2312",15, RGB(0,255,255) ,"武警指挥学院模拟中心");
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight,&m_dcText, 0,0, SRCCOPY);
}
8.改变文字垂向位置,出现循环滚动效果:
void CSplashWnd::OnTimer(UINT nIDEvent)
{ m_nCurPos++;
if( m_nCurPos>300 ) //循环
{ m_nCurPos = 0 ;
}
Invalidate(TRUE);
}
9. 演示软件封面时,隐藏主框架窗口:
BOOL CTestApp::InitInstance()
{ m_pMainWnd->ShowWindow(SW_HIDE);
m_pMainWnd->UpdateWindow();
}
10.按任意键或点击鼠标键结束封面演示:
LRESULT CSplashWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{ if (c_pSplashWnd)
{
if (message == WM_KEYDOWN ||message == WM_SYSKEYDOWN ||
message == WM_LBUTTONDOWN ||message == WM_RBUTTONDOWN ||
message == WM_MBUTTONDOWN ||message == WM_NCLBUTTONDOWN ||
message == WM_NCRBUTTONDOWN ||message == WM_NCMBUTTONDOWN)
{ c_pSplashWnd->HideSplashScreen();
AfxGetMainWnd()->ShowWindow(SW_MAXIMIZE);
return TRUE;
}
}
return CWnd::WindowProc(message, wParam, lParam);
}
11.封面窗口销毁后,释放有关对象:
void CSplashWnd::PostNcDestroy()
{ m_dcImage.SelectObject(m_pOldBitmap);
m_dcText.SelectClipRgn(NULL);
m_dcText.SelectObject(m_pOldBitmapText);
m_bitmap.DeleteObject();
m_rgn.DeleteObject();
delete this;
}
利用Visual C++的组件库中的Splash Screen组件可以很方便的在应用程序中实现Splash Screen。但是由于这个组件缺省时使用16色位图,因此很多人误认为这个组件仅支持16色位图。其实,这个组件是可以支持真彩色位图的。
1.制作封面位图、开始音乐等资源文件
制作应用程序启动封面真彩位图,建立所需要播放的声音文件等。
2.在资源中插入位图资源
打开VC++的资源编辑器,用鼠标右键单击Resources文件夹,选择Import命令,插入你所制作的真彩位图。这时VC++会弹出一个对话框,显示下列信息:
“The bitmap has been imported correctly, however because it contains more than 256 colors it cannot be loaded in the bitmap editor”。
不用担心,你的真彩位图已经被成功地插入资源里了。将其ID改为IDB_SPLASH。
3.插入Splash Screen组件
从Project菜单选择Add To Project->Components and Controls...命令,选择Developer studio components中的Splash screen组件,将对话框中的位图资源ID改为你的真彩位图的ID。然后删除VC++自动加入到资源中的缺省16色启动封面位图(可选)。编译、连接,漂亮的真彩启动封面就显示出来了。
4.增强功能
*基于对话框的应用程序
基于对话框的应用程序不能插入Splash Screen组件。利用下面的方法可以实现基于对话框的应用程序启动画面:重复上面的第1,2步骤,将已经生成的Splash.cpp和Splash.h文件(可以使用其他项目的文件)拷贝到工作文件夹,并将其加入到你的基于对话框的项目中(使用Project菜单下的Add To Project->Files...命令)。
在CWinApp派生类的InitInstance()中加入下列代码:
#include "Splash.h"
BOOL CDialogsplApp::InitInstance()
{
// CG: The following block was added by the Splash Screen component.
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash);
}
......
}
使用Class Wizard为在CDialog派生类添加OnCreate()函数,并加入下列代码:
#include "Splash.h"
int CDialogsplDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// CG: The following line was added by the Splash Screen component.
CSplashWnd::ShowSplashScreen(this);
return 0;
}
最后将Splash.cpp文件中的CSplashWnd::Create()函数中的位图资源ID改为真彩位图的ID就可以了。
BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
{
if (!m_bitmap.LoadBitmap(IDB_BITMAP1))
return FALSE;
......
}
*播放音乐
在MainFrm.cpp文件的开始部分加入下列语句:
#include "mmsystem.h"//多媒体
#pragma comment(lib,"winmm.lib")//多媒体
在CMainFrame::OnCreate()函数中的ShowSplashScreen之后加入下列语句即可:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
// CG: The following line was added by the Splash Screen component.
CSplashWnd::ShowSplashScreen(this);
BOOL r = sndPlaySound("start.wav",SND_ASYNC|SND_NODEFAULT);//播放WAV文件
ASSERT(r);
Sleep(4500);
r = sndPlaySound("",SND_ASYNC|SND_NODEFAULT);//停止播放
return 0;
}