浅议软件封面的制作方法

发表于:2007-07-14来源:作者:点击数: 标签:
曹朝晖 问题的提出 软件封面是指软件启动加载时显示的背景画面,它不但可以起到吸引用户目光的作用,更重要的是当一些程序的初始化工作需要数秒钟时,软件封面可以用来向用户提供一些与该软件相关的信息。软件封面一般包含了软件名称、版本、用户名、用户所
曹朝晖

问题的提出
软件封面是指软件启动加载时显示的背景画面,它不但可以起到吸引用户目光的作用,更重要的是当一些程序的初始化工作需要数秒钟时,软件封面可以用来向用户提供一些与该软件相关的信息。软件封面一般包含了软件名称、版本、用户名、用户所在的公司名等信息,显示方式一般分为静态画面和动画。软件封面的制作方法有多种,从易到难,由浅到深,编程人员可以根据需要选择不同的制作方法。本文介绍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->DragAclearcase/" target="_blank" >cceptFiles();
 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函数调用即可,既简单,效果又好。

原文转自:http://www.ltesting.net