浅议软件封面的制作方法
【打印文章】
曹朝晖
问题的提出
软件封面是指软件启动加载时显示的背景画面,它不但可以起到吸引用户目光的作用,更重要的是当一些程序的初始化工作需要数秒钟时,软件封面可以用来向用户提供一些与该软件相关的信息。软件封面一般包含了软件名称、版本、用户名、用户所在的公司名等信息,显示方式一般分为静态画面和动画。软件封面的制作方法有多种,从易到难,由浅到深,编程人员可以根据需要选择不同的制作方法。本文介绍3种软件封面的制作方法。
添加VC组件
添加组件是制作程序加载背景的一种简单方法。首先进入VC的菜单项Project|Add To Project|Components and Control…,选择Splash Screen组件。然后用Windows附带的画图程序制作一幅位图,在该位图中,可以加入各种各样的信息:如文字、图片等。最后把该位图的资源标识号改为IDB_SPLASH,并确定显示时间,定位到函数OnCreate()中:
int CsplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
CenterWindow();
//添加下述代码
SetTimer(1,2000,NULL);//显示2000个毫秒
return 0;
}
该方法的特点是编程简单,且容易实现。但由于只能加载一幅静态画面,所以显得过于单调。
使用Authorware
我们可以利用多媒体制作软件Authorware制作一个多媒体可执行程序(.exe),再用VC的WinExec函数调用该程序的方法来实现动画背景的加载。该方法的主要代码如下:
void CStdio1View::OnDraw(CDC* pDC)
{
CStdio1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//添加如下内容
if(m_j==TRUE)
{
//以最大化显示软件动画
WinExec(“YourSofeFace.exe”,SW_MAXIMIZE);
//只在开始时显示
m_j=FALSE;
}
……
}
利用MCIWnd窗口类
MCIWnd是一个控制多媒体设备(如MIDI、数字视频以及CD音频设备等)的窗口类,它提供了一系列的函数、消息和宏,可以非常容易地将多媒体播放和录制功能添加到程序中。本文介绍两种利用MCIWnd类播放AVI文件实现加载动画背景的方法。
1.一种方法是在开始时就运行AVI动画,用户不能中途干预。主要代码如下:
//初始化函数
BOOL CStdio1App::InitInstance()
{
……
//AVI文件名
CString filename=“mpc.avi”;
DWORD dwMCIWndStyle;
//播放AVI窗口的属性
dwMCIWndStyle=WS_CAPTION|WS_MAXIMIZE|WS_POPUP|WS_VISIBLE|MCIWNDF_NOPLAYBAR|MCIWNDF_NOERRORDLG|MCIWNDF_NOTIFYERROR|
MCIWNDF_NOT IFYMODE;
long lend,lpos;
//建立播放AVI的窗口
m_hwndMCIWnd=MCIWndCreate(m_hWnd,
AfxGetInstanceHandle(),dwMCIWndStyle,filename);
if(m_hwndMCIWnd)
{
//开始播放
MCIWndPlay(m_hwndMCIWnd);
//取得AVI文件结尾
lend=MCIWndGetEnd(m_hwndMCIWnd);
//当前播放的位置
lpos=MCIWndGetPosition(m_hwndMCIWnd);
//查询是否播放完了
while(lpos<lend)
{
//当前位置
lpos=MCIWndGetPosition(m_hwndMCIWnd);
}
//播放完后注销AVI窗口
MCIWndDestroy(m_hwndMCIWnd);
}
……
}
该方法比较简单,缺点是播放期间只能等待,无法人工干预。
2.第二种方法可以弥补第一种方法的缺陷,即在动画播放时,可以随时进行用户干预。主要代码如下:
BOOL CStdio1App ::InitInstance()
{
……
m_pMainWnd->ShowWindo(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
//注册MCIWnd窗口类
if(!MCIWndRegisterClass())
return FALSE;
DWORD dwMCIWndStyle;
//AVI窗口的风格
dwMCIWndStyle=WS_CAPTION|WS_MAXIMIZE|WS_POPUP|WS_VISIBLE|MCIWNDF_NOPLAYBAR|MCIWNDF_NOERRORDLG|MCIWNDF_NOTIFYERROR|MCIWNDF_NOTIFYMODE;
//建立MCIWnd 窗口
aviWnd=::MCIWndCreate(m_pMainWnd->
m_hWnd,AfxGetInstanceHandle(),dwMCIWndStyle,“mpc.avi”);
//表示MCIWnd 窗口存在
nFlag=TRUE;
//取开始时间
CTime m_dwSplashTime=::GetCurrentTime();
//播放
MCIWndPlay(aviWnd);
m_pMainWnd->DragAcceptFiles();
return TRUE;
}
注销一个正在播放的动画窗口有两种方法,一种是设定播放时间,另一种是接受用户命令直接注销。为设定播放时间,可在程序中添加消息OnIdle,设定经过一段时间后,就注销动画窗口:
BOOL CStdio1App ::OnIdle(LONG lCount)
{
BOOL bResult=CWinApp::OnIdle(lCount);
//提取当前时间
CTime t=CTime::GetCurrentTime();
if(nFlag)
{
//设定播放时间为10000毫秒
if(t-m_dwSplashTime>10000)
{
//销毁MCIWnd 窗口
DestroyWindow(aviWnd);
//显示程序的主框架窗口
m_pMainWnd->ShowWindow(SW_NORMAL);
m_pMainWnd->UpdateWindow();
nFlag=FALSE;
}
else{
bResult=TRUE;
}
return bResult;
}
return TRUE;
}
当由用户直接键入命令结束播放时,使用映射消息PreTranslateMessage接受用户的键盘或鼠标输入:
BOOL :: CStdio1App PreTranslateMessage(MSG* pMsg)
{
if(aviWnd!=NULL&&(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||WM_NCMBUTTONDOWN))
{
//注销
DestroyWindow(aviWnd);
m_pMainWnd->ShowWindow(SW_MAXIMIZE);
m_pMainWnd->UpdateWindow();
nFlag=FALSE;
aviWnd=NULL;
}
return CWinApp::PreTranslateMessage(pMsg);
}
小 结
上述3种软件封面的制作方法中,一般大型软件采用第一种静态画面的方法,因为此时程序本身比较大,如果再用一个消耗大量内存的动画作为封面,就有可能造成计算机内存容量不足,影响软件的正常运行。对于面向大众化的多媒体软件,一般为了先声夺人,引人入胜,大多采用AVI动画作为软件封面。而面向学生的多媒体教学课件,一般用Authorware做一个动画程序,再用 WinExec函数调用即可,既简单,效果又好。
问题的提出
软件封面是指软件启动加载时显示的背景画面,它不但可以起到吸引用户目光的作用,更重要的是当一些程序的初始化工作需要数秒钟时,软件封面可以用来向用户提供一些与该软件相关的信息。软件封面一般包含了软件名称、版本、用户名、用户所在的公司名等信息,显示方式一般分为静态画面和动画。软件封面的制作方法有多种,从易到难,由浅到深,编程人员可以根据需要选择不同的制作方法。本文介绍3种软件封面的制作方法。
添加VC组件
添加组件是制作程序加载背景的一种简单方法。首先进入VC的菜单项Project|Add To Project|Components and Control…,选择Splash Screen组件。然后用Windows附带的画图程序制作一幅位图,在该位图中,可以加入各种各样的信息:如文字、图片等。最后把该位图的资源标识号改为IDB_SPLASH,并确定显示时间,定位到函数OnCreate()中:
int CsplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
CenterWindow();
//添加下述代码
SetTimer(1,2000,NULL);//显示2000个毫秒
return 0;
}
该方法的特点是编程简单,且容易实现。但由于只能加载一幅静态画面,所以显得过于单调。
使用Authorware
我们可以利用多媒体制作软件Authorware制作一个多媒体可执行程序(.exe),再用VC的WinExec函数调用该程序的方法来实现动画背景的加载。该方法的主要代码如下:
void CStdio1View::OnDraw(CDC* pDC)
{
CStdio1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//添加如下内容
if(m_j==TRUE)
{
//以最大化显示软件动画
WinExec(“YourSofeFace.exe”,SW_MAXIMIZE);
//只在开始时显示
m_j=FALSE;
}
……
}
利用MCIWnd窗口类
MCIWnd是一个控制多媒体设备(如MIDI、数字视频以及CD音频设备等)的窗口类,它提供了一系列的函数、消息和宏,可以非常容易地将多媒体播放和录制功能添加到程序中。本文介绍两种利用MCIWnd类播放AVI文件实现加载动画背景的方法。
1.一种方法是在开始时就运行AVI动画,用户不能中途干预。主要代码如下:
//初始化函数
BOOL CStdio1App::InitInstance()
{
……
//AVI文件名
CString filename=“mpc.avi”;
DWORD dwMCIWndStyle;
//播放AVI窗口的属性
dwMCIWndStyle=WS_CAPTION|WS_MAXIMIZE|WS_POPUP|WS_VISIBLE|MCIWNDF_NOPLAYBAR|MCIWNDF_NOERRORDLG|MCIWNDF_NOTIFYERROR|
MCIWNDF_NOT IFYMODE;
long lend,lpos;
//建立播放AVI的窗口
m_hwndMCIWnd=MCIWndCreate(m_hWnd,
AfxGetInstanceHandle(),dwMCIWndStyle,filename);
if(m_hwndMCIWnd)
{
//开始播放
MCIWndPlay(m_hwndMCIWnd);
//取得AVI文件结尾
lend=MCIWndGetEnd(m_hwndMCIWnd);
//当前播放的位置
lpos=MCIWndGetPosition(m_hwndMCIWnd);
//查询是否播放完了
while(lpos<lend)
{
//当前位置
lpos=MCIWndGetPosition(m_hwndMCIWnd);
}
//播放完后注销AVI窗口
MCIWndDestroy(m_hwndMCIWnd);
}
……
}
该方法比较简单,缺点是播放期间只能等待,无法人工干预。
2.第二种方法可以弥补第一种方法的缺陷,即在动画播放时,可以随时进行用户干预。主要代码如下:
BOOL CStdio1App ::InitInstance()
{
……
m_pMainWnd->ShowWindo(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();
//注册MCIWnd窗口类
if(!MCIWndRegisterClass())
return FALSE;
DWORD dwMCIWndStyle;
//AVI窗口的风格
dwMCIWndStyle=WS_CAPTION|WS_MAXIMIZE|WS_POPUP|WS_VISIBLE|MCIWNDF_NOPLAYBAR|MCIWNDF_NOERRORDLG|MCIWNDF_NOTIFYERROR|MCIWNDF_NOTIFYMODE;
//建立MCIWnd 窗口
aviWnd=::MCIWndCreate(m_pMainWnd->
m_hWnd,AfxGetInstanceHandle(),dwMCIWndStyle,“mpc.avi”);
//表示MCIWnd 窗口存在
nFlag=TRUE;
//取开始时间
CTime m_dwSplashTime=::GetCurrentTime();
//播放
MCIWndPlay(aviWnd);
m_pMainWnd->DragAcceptFiles();
return TRUE;
}
注销一个正在播放的动画窗口有两种方法,一种是设定播放时间,另一种是接受用户命令直接注销。为设定播放时间,可在程序中添加消息OnIdle,设定经过一段时间后,就注销动画窗口:
BOOL CStdio1App ::OnIdle(LONG lCount)
{
BOOL bResult=CWinApp::OnIdle(lCount);
//提取当前时间
CTime t=CTime::GetCurrentTime();
if(nFlag)
{
//设定播放时间为10000毫秒
if(t-m_dwSplashTime>10000)
{
//销毁MCIWnd 窗口
DestroyWindow(aviWnd);
//显示程序的主框架窗口
m_pMainWnd->ShowWindow(SW_NORMAL);
m_pMainWnd->UpdateWindow();
nFlag=FALSE;
}
else{
bResult=TRUE;
}
return bResult;
}
return TRUE;
}
当由用户直接键入命令结束播放时,使用映射消息PreTranslateMessage接受用户的键盘或鼠标输入:
BOOL :: CStdio1App PreTranslateMessage(MSG* pMsg)
{
if(aviWnd!=NULL&&(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||WM_NCMBUTTONDOWN))
{
//注销
DestroyWindow(aviWnd);
m_pMainWnd->ShowWindow(SW_MAXIMIZE);
m_pMainWnd->UpdateWindow();
nFlag=FALSE;
aviWnd=NULL;
}
return CWinApp::PreTranslateMessage(pMsg);
}
小 结
上述3种软件封面的制作方法中,一般大型软件采用第一种静态画面的方法,因为此时程序本身比较大,如果再用一个消耗大量内存的动画作为封面,就有可能造成计算机内存容量不足,影响软件的正常运行。对于面向大众化的多媒体软件,一般为了先声夺人,引人入胜,大多采用AVI动画作为软件封面。而面向学生的多媒体教学课件,一般用Authorware做一个动画程序,再用 WinExec函数调用即可,既简单,效果又好。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】