Prettygirl的文章

  • 使用mciSendString在指定窗口里播放视频文件并设置播放视频画面大小

    背景mciSendString 函数是一个功能强大的函数,它有自己的mci命令,通过传入mci命令从而控制多媒体设备的操作。之前使用过 mciSendString 函数播放视频,但是,那个程序并没有做得很完善,没有指定在哪个窗口上播放显示,也没有设置播放视频的宽高大小。
    后来,无意中在网上看到别人写的一些总结,感觉写得很详细,一下子就学会了指定播放窗口以及播放画面大小的设置。
    现在,我把实现原理以及实现过程,写成文档分享给大家。
    函数介绍mciSendString 函数
    mciSendString函数向MCI设备发送命令字符串。 在命令字符串中指定发送命令的设备。mciSendString是用来播放多媒体文件的API指令,可以播放MPEG、AVI、WAV、MP3等
    函数声明
    MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
    参数

    lpszCommand指向指定MCI命令字符串的以NULL结尾的字符串的指针。 有关列表,请参阅多媒体命令字符串。lpszReturnString指向接收返回信息的缓冲区的指针。 如果不需要返回信息,该参数可以为NULL。cchReturn由lpszReturnString参数指定的返回缓冲区的大小(以字符为单位)。hwndCallback如果在命令字符串中指定了“notify”标志,则处理回调窗口。
    返回值

    如果成功返回零,否则返回错误。

    GetDlgItem 函数
    获取窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。
    函数声明
    HWND GetDlgItem( HWN DhDlg, // handle to dialog box int nIDDlgItem // control identifier);
    参数

    hDlg
    标识含有控件的对话框。
    nlDDlgltem
    指定将被检索的控件标识符。

    返回值

    如果函数调用成功则返回值为给定控件的窗口句柄。如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控件。若想获得更多错误信息,请调用GetLastError函数。

    实现原理mciSendString函数的使用不是很复杂,关键是理解mci的命令。
    对于设置视频播放在指定窗口的命令是:
    open 视频文件路径 parent 窗口句柄 style 窗口WS_CHILD风格例如,本文中为:open “test.wmv” alias myvideo parent 123 style 0x40000000。
    对于设置视频播放画面的位置及其大小的命令是:
    put 视频文件路径 window at 起始坐标X 起始坐标Y 画面宽度 画面高度例如,本文中为:put myvideo window at 0 0 800 440。注意,put 命令要放在 play 指令之前执行。
    编程实现void PlayVideoInWindow(char *pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight){ char szSetWindowsMci[MAX_PATH] = { 0 }; char szSetVideoSizeMci[MAX_PATH] = { 0 }; // 构造mci打开视频命令, 设置视频播放的窗口 ::wsprintf(szSetWindowsMci, "open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD); // 构造mci视频播放位置大小命令, 设置视频播放的窗口 ::wsprintf(szSetVideoSizeMci, "put myvideo window at %d %d %d %d", x, y, iWidth, iHeight); // 打开视频, 指定窗口 ::mciSendString(szSetWindowsMci, NULL, 0, NULL); // 设置视频播放位置及画面大小 ::mciSendString(szSetVideoSizeMci, NULL, 0, NULL); // 播放视频 ::mciSendString("play myvideo", NULL, 0, NULL);}
    程序测试在项目中调用上述封装好的函数进行测试,调用部分代码为:
    void CmciSendString_PlayVideo_TestDlg::OnBnClickedAbort(){ // TODO: 在此添加控件通知处理程序代码 int x = 0, y = 0; int iWidth = 800; int iHeight = 440; // 获取控件的句柄 HWND hWnd = ::GetDlgItem(m_hWnd, IDC_STATIC_VIDEO); // 在指定窗口中播放, 并设置画面位置大小 PlayVideoInWindow("test.wmv", hWnd, x, y, iWidth, iHeight);}
    测试结果
    运行测序,点击“Play Video”,可以看到视频画面成功显示在了静态框空间中,而且视频画面位置起点为 (0, 0),大小也为 800x440,所以,测试成功。

    总结代码不是很多,关键是要熟悉mci命令。这个不需要刻意去背,可以先了解有这个知识点,等到真正需要用到的时候,再去深入检索研究就好。
    2  留言 2018-12-28 16:14:41
  • 使用mciSendString在指定窗口里播放视频文件并设置播放视频画面大小

    背景mciSendString 函数是一个功能强大的函数,它有自己的mci命令,通过传入mci命令从而控制多媒体设备的操作。之前使用过 mciSendString 函数播放视频,但是,那个程序并没有做得很完善,没有指定在哪个窗口上播放显示,也没有设置播放视频的宽高大小。
    后来,无意中在网上看到别人写的一些总结,感觉写得很详细,一下子就学会了指定播放窗口以及播放画面大小的设置。
    现在,我把实现原理以及实现过程,写成文档分享给大家。
    函数介绍mciSendString 函数
    mciSendString函数向MCI设备发送命令字符串。 在命令字符串中指定发送命令的设备。mciSendString是用来播放多媒体文件的API指令,可以播放MPEG、AVI、WAV、MP3等
    函数声明
    MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
    参数

    lpszCommand指向指定MCI命令字符串的以NULL结尾的字符串的指针。 有关列表,请参阅多媒体命令字符串。lpszReturnString指向接收返回信息的缓冲区的指针。 如果不需要返回信息,该参数可以为NULL。cchReturn由lpszReturnString参数指定的返回缓冲区的大小(以字符为单位)。hwndCallback如果在命令字符串中指定了“notify”标志,则处理回调窗口。
    返回值

    如果成功返回零,否则返回错误。

    GetDlgItem 函数
    获取窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。
    函数声明
    HWND GetDlgItem( HWN DhDlg, // handle to dialog box int nIDDlgItem // control identifier);
    参数

    hDlg
    标识含有控件的对话框。
    nlDDlgltem
    指定将被检索的控件标识符。

    返回值

    如果函数调用成功则返回值为给定控件的窗口句柄。如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控件。若想获得更多错误信息,请调用GetLastError函数。

    实现原理mciSendString函数的使用不是很复杂,关键是理解mci的命令。
    对于设置视频播放在指定窗口的命令是:
    open 视频文件路径 parent 窗口句柄 style 窗口WS_CHILD风格例如,本文中为:open “test.wmv” alias myvideo parent 123 style 0x40000000。
    对于设置视频播放画面的位置及其大小的命令是:
    put 视频文件路径 window at 起始坐标X 起始坐标Y 画面宽度 画面高度例如,本文中为:put myvideo window at 0 0 800 440。注意,put 命令要放在 play 指令之前执行。
    编程实现void PlayVideoInWindow(char *pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight){ char szSetWindowsMci[MAX_PATH] = { 0 }; char szSetVideoSizeMci[MAX_PATH] = { 0 }; // 构造mci打开视频命令, 设置视频播放的窗口 ::wsprintf(szSetWindowsMci, "open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD); // 构造mci视频播放位置大小命令, 设置视频播放的窗口 ::wsprintf(szSetVideoSizeMci, "put myvideo window at %d %d %d %d", x, y, iWidth, iHeight); // 打开视频, 指定窗口 ::mciSendString(szSetWindowsMci, NULL, 0, NULL); // 设置视频播放位置及画面大小 ::mciSendString(szSetVideoSizeMci, NULL, 0, NULL); // 播放视频 ::mciSendString("play myvideo", NULL, 0, NULL);}
    程序测试在项目中调用上述封装好的函数进行测试,调用部分代码为:
    void CmciSendString_PlayVideo_TestDlg::OnBnClickedAbort(){ // TODO: 在此添加控件通知处理程序代码 int x = 0, y = 0; int iWidth = 800; int iHeight = 440; // 获取控件的句柄 HWND hWnd = ::GetDlgItem(m_hWnd, IDC_STATIC_VIDEO); // 在指定窗口中播放, 并设置画面位置大小 PlayVideoInWindow("test.wmv", hWnd, x, y, iWidth, iHeight);}
    测试结果
    运行测序,点击“Play Video”,可以看到视频画面成功显示在了静态框空间中,而且视频画面位置起点为 (0, 0),大小也为 800x440,所以,测试成功。

    总结代码不是很多,关键是要熟悉mci命令。这个不需要刻意去背,可以先了解有这个知识点,等到真正需要用到的时候,再去深入检索研究就好。
    1  留言 2018-11-06 22:56:57
eject