将视频演示作为应用程序的启动封面

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuxiongtao 的 blog

作者: 哈尔滨 潘景岩

---- 需要解决四个问题:
---- 首先,在应用程序视类的构造函数中创建视频窗口,在初始化函数中开始播放;
---- 其次,建立一个计时器。利用class vizard为wm_timer增加消息处理函数,以自动关闭视频窗口并显示应用程序主窗口;
---- 另外,为了便于从mciwnd子类化窗口的鼠标消息处理函数中,对应用程序视类的计时器处理函数进行控制,引入一个布尔型全局变量,用来标示是否可以关闭视频窗口;
---- 最后,也是最关键的,应用程序可以截获发生在主窗口内的鼠标消息,却无法截获发生在视频窗口内的鼠标消息,因为windows已将视频窗口的鼠标消息处理函数封装在mciwnd窗口类中。所以,为了截获发生在视频窗口内的鼠标信息,需要重新定义mciwnd窗口消息处理函数。
---- 具体操作步骤如下(在visual c++6.0环境下调试通过):
---- (1)在应用程序类的头文件中加入布尔型全局变量:
class cmyapp : public cwinapp
{
public:
bool m_canclose;
...
}
  
(2)在应用程序类的构造函数中对这一标志变量进行初始化:
cmyapp::cmyapp()
{
m_canclose=false;
...
}
  
(3)在cmyview类的头文件中,加入成员変量:
private:
hwnd m_videownd; //视频窗口句柄
long m_videolength; //视频放映总长度
  
(4)在myview.cpp文件中加入以下内容:
wndproc oldproc; //保存原映射函数
lresult callback newproc(hwnd,uint,
wparam,lparam);
//新映射函数
...
cmyview::cmyview()
{
cstring filename("d:\\video\\cover.avi");
//建立视频窗口,并将句柄保存在m_videownd中:
m_videownd = mciwndcreate(
this- >getsafehwnd(),
afxgetinstancehandle(),
ws_popup|ws_visible|
mciwndf_noplaybar|
mciwndf_nomenu,
filename);
//使视频窗口在屏幕上居中显示:
rect rect;
int sx,sy;
::getwindowrect(m_videownd,&rect);
sx=(::getsystemmetrics(sm_cxscreen)
-rect.right+rect.left)/2;
sy=(::getsystemmetrics(sm_cyscreen)
-rect.bottom+rect.top)/2;
::setwindowpos(m_videownd,hwnd_topmost,sx,
sy,0,0,swp_showwindow|swp_nosize);
}
  
void cmyview::oninitialupdate()
{
cview::oninitialupdate();
/* 调用getwindowlong函数得到
m_videownd窗口原消息处理函数的入口地址,
并保存在oldproc中。*/
oldproc=(wndproc) ::getwindowlong(m_videownd,
gwl_wndproc);
/* 调用setwindowlong函数将
m_videownd窗口消息处理函数的入口地址改为newproc */
::setwindowlong(m_videownd,gwl_wndproc,
(long)newproc);
m_videolength = mciwndgetlength(m_videownd);
//得到视频放映总长度
mciwndplay(m_videownd);
//播放视频文件
settimer(1,20,null);
//建立计时器,每20毫秒激活一次ontimer函数
  
}
  
void cmyview::ontimer(uint nidevent)
{
cmyapp *app=(cmyapp *)afxgetapp();
if(mciwndgetposition(m_videownd) >=m_videolength
//自动播放结束
||app-> m_canclose==true)
//人为按下鼠标左键结束
{
killtimer(1); //撤消计时器
mciwnddestroy(m_videownd); //撤消视频窗口
afxgetmainwnd()- >showwindow(sw_showmaximized);
//显示主窗口
}
cmyview::ontimer(nidevent);
}
  
lresult callback newproc(hwnd hwnd,uint message,
wparam wparam,lparam lparam)
{
if(message==wm_lbuttondown) //鼠标左键被按下
{
cjapanapp *app=(cjapanapp *)afxgetapp();
app- >m_canclose=true; //可以关闭视频窗口
}
//如果不是鼠标左键按下消息,则调用原处理函数:
return callwindowproc(oldproc,hwnd,
message,wparam,lparam);
}

本文关键:将视频演示作为应用程序的启动封面
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top