zoukankan      html  css  js  c++  java
  • 将视频演示作为应用程序的启动封面

    ---- 需要解决四个问题:
    ---- 首先,在应用程序视类的构造函数中创建视频窗口,在初始化函数中开始播放;
    ---- 其次,建立一个计时器。利用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);
    }
  • 相关阅读:
    【Axure】快捷键大全
    【docker】mysql
    PHP filesystem attack vectors
    如何防御“神器”Mimikatz窃取系统密码?
    一段能导致火狐、谷歌Safari浏览器崩溃,甚至让iPhone重启的代码
    windows mysql 自动备份的几种方法
    Mysql的实时同步
    ThinkPHP留后门技巧
    创造tips的秘籍——PHP回调后门
    windows自带的压缩,解压缩命令
  • 原文地址:https://www.cnblogs.com/flying_bat/p/189180.html
Copyright © 2011-2022 走看看