辽宁省铁岭市委办公室 宋立波
----在自己的应用程序定制多媒体真彩封页,可以使应用程序在显示名称和版权特性时丰富程序界面,避免由于应用程序启动前进行大量数据初始化时用户进行较长时间的空等待过程,在给应用程序增加了生动特性和专业特性的同时,也起到了宣传和广告的作用。虽然VC5中具有特定的类来实现这一功能,但通过定制自己的应用程序多媒体启动封页,还可使自己的应用程序别具一格。VC5中的实现步骤:
----一、制作封页位图:制作应用程序多媒体启动封页真彩位图,记录位图的高度和宽度,建立所需要的其它多媒体声音等文件;
----二、建立应用程序:利用FILE->NEW菜单建立名为START的多文档应用程序框架,并利用类向导AppWizard增加基类为generic CWnd的新类CSplashWnd,将新类的文件改名为splash.h和splash.cpp,并增加WM_CREATE和WM_PAINT的消息映射函数;
----三、定义变量和函数:在splash.h中定义如下成员变量和函数:
public:
BOOL Create(CWnd* pParentWnd=NULL);
HANDLE hBitsSrc;
LPSTR pBitsSrc;
UINT iW,iH;
----四、建立启动封页窗口:在splash.cpp中增加Create函数,建立显示位图的弹出窗口:
#include "windowsx.h"//增加扩展窗口建立
......
struct{//位图文件头结构
BITMAPINFOHEADER Header;
}Info;
BOOL CSplashWnd::Create(CWnd* pParentWnd)
{ //建立显示位图的弹出窗口
return CreateEx(0,AfxRegisterWndClass(0,
AfxGetApp()- >LoadStandardCursor(IDC_ARROW)),
NULL,WS_POPUP|WS_VISIBLE,0,0,672,480,
pParentWnd- >GetSafeHwnd(),NULL);
}
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ ......
// TODO: Add your specialized creation code here
CenterWindow();//使弹出窗口居中
return 0;
}
----五、完善析构函数:在splash.cpp中完善析构函数,为显示位图作准备:
CSplashWnd::CSplashWnd()//完善析构函数
{ iW=672;iH=480;//位图的宽度和高度
Info.Header.biSize=sizeof(BITMAPINFOHEADER);
Info.Header.biWidth=iW;
Info.Header.biHeight=iH;
Info.Header.biPlanes=1L;
Info.Header.biBitCount=24L;
hBitsSrc=::GlobalAlloc(GHND,(long)(iW*iH*3));//分配内存
pBitsSrc=(LPSTR)::GlobalLock(hBitsSrc);//加锁内存
}
CSplashWnd::~CSplashWnd()
{ ::GlobalUnlock(hBitsSrc);//解锁内存
::GlobalFree(hBitsSrc);//释放内存
}
----六、显示真彩位图:在splash.cpp中完善Onpaint函数,实现真彩位图
的显示:
void CSplashWnd::OnPaint()
{......// TODO: Add your message handler code here
CFile fbmp;
fbmp.Open("c://windows//EMC1.BMP",CFile::modeRead|
CFile::typeBinary|CFile::shareExclusive);//打开文件
fbmp.Seek(54,CFile::begin);//位图文件头为54字节
fbmp.ReadHuge(pBitsSrc,(long)(iW*iH*3));//读文件
fbmp.Close();//关闭文件
HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,
(BITMAPINFOHEADER FAR*)&(Info.Header),CBM_INIT,
pBitsSrc,(LPBITMAPINFO)&Info,DIB_RGB_COLORS);//建立位图
HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);//建立内存
HBITMAP hBitmapOld=SelectBitmap(hMemDC,hBitmap);//选择对象
::StretchBlt(dc.m_hDC,0,0,iW,iH,hMemDC,
0,0,iW,iH,SRCCOPY);//显示真彩位图
::DeleteObject(SelectObject(hMemDC,hBitmapOld));//删除位图
}
----七、弹出窗口类声明:在Mainfrm.h中增加代码,为显示和撤销弹
出窗口作准备:
class CsplashWnd;//闪烁窗口类
......
class CMainFrame : public CMDIFrameWnd
{......
public:
CSplashWnd SplashWnd;//声明类
----八、真彩封页的实现:在Mainfrm.cpp中增加显示弹出窗口、播放音乐、
延时功能和撤销弹出窗口的代码,以实现真彩封页的整个处理过程:
#include "splash.h" //新类支持
#include "mmsystem.h"//多媒体支持
#pragma comment(lib,"WINMM.LIB")//多媒体支持
......
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
SplashWnd.Create(this);//创建弹出窗口
SplashWnd.ShowWindow(SW_SHOW);//显示弹出窗口
SplashWnd.UpdateWindow();//更新弹出窗口
int dd=sndPlaySound("c://windows//reminder.wav",
SND_ASYNC|SND_LOOP);//异步播放WAV文件
if (dd==FALSE){//参数SND_ASYNC|SND_LOOP可循环播放
AfxMessageBox("播放WAV文件错误~");
}
::Sleep(2000);//进程休眠2秒
......//应用程序初始化工作
dd=sndPlaySound("",SND_ASYNC);//终止播放.WAV文件
SplashWnd.DestroyWindow();//撤消弹出窗口
return 0;
}
----经过上述八个步骤的处理,整个多媒体真彩启动封页制作完毕。读者还可根据需要增加动画和移动字幕等其它多媒体效果。
选载自中国程序员网站
|