我愿分享我所有的技术,你可愿意做我的朋友?

----赵大哥
为何要写这篇博客
纯WIN32API打造,自认为对底层的理解略有帮助,和大家分享成果和知识点。
已经实现功能有:打开、播放、关闭功能。
核心功能讲解:
1.WIN32打开文件对话框
BOOL OpenFileDlg(HWND hWnd, TCHAR* szFileSelect)
{
    OPENFILENAME ofn;
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    //需要兼容UNICODE处理
    ZeroMemory(szFileSelect, sizeof(TCHAR)*MAX_PATH_LEN);
    ofn.Flags = OFN_EXPLORER;
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = szFileSelect;
    ofn.lpstrFile[] = '\0';
    ofn.lpstrFileTitle = szFileFilter;
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.nMaxFile = MAX_PATH_LEN;
    ofn.nMaxFileTitle = MAX_PATH_LEN;
    if(GetOpenFileName(&ofn))
    {
        //与网上给出的方法不同,实践中只要打开OK,文件路径就保存在ofn.lpstrFile参数中
        return TRUE;
    }
    return FALSE;
}
需要注意的是lpstrFile[0]必须设置为'\0'才能弹出对话框。
2.MCI系列API使用
打开视频并预览一下
void OpenVideoFile(HWND hWnd)
{
    TCHAR szFileSelect[MAX_PATH_LEN];
    if(OpenFileDlg(hWnd, szFileSelect))
    {
        MCI_DGV_OPEN_PARMS MciOpenParams;
        ZeroMemory(&MciOpenParams, sizeof(MciOpenParams));
        MciOpenParams.dwCallback = (DWORD)hWnd;
        //指定dwStyle为WS_CHILD和mciSendCommand中的MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS,新打开的视频窗口为主窗口的子窗口
        MciOpenParams.dwStyle = WS_CHILD;
        MciOpenParams.hWndParent = hWnd;
        MciOpenParams.lpstrElementName = szFileSelect;
        mciSendCommand(MciOpenParams.wDeviceID, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, (DWORD)&MciOpenParams);
        g_MciDevId = MciOpenParams.wDeviceID;         //指定MCI_DGV_STATUS_HWND参数以获取视频子窗口的句柄
        MCI_DGV_STATUS_PARMS MciStatusParams;
        MciStatusParams.dwItem = MCI_DGV_STATUS_HWND;
        mciSendCommand(MciOpenParams.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&MciStatusParams);
        hVideo = (HWND)MciStatusParams.dwReturn;
        //根据主窗体的大小调节视频窗口的大小
        GetClientRect(hWnd, &ClientRect);
        MoveWindow(hVideo, , , ClientRect.right - ClientRect.left - , ClientRect.bottom - ClientRect.top - , TRUE);         //播放视频预览
        MCI_DGV_PLAY_PARMS MciPlayParams;
        MciPlayParams.dwCallback = (DWORD)PlayWndProc;
        MciPlayParams.dwFrom = ;
        MciPlayParams.dwTo = ;
        mciSendCommand(MciOpenParams.wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)&MciPlayParams);
        mciSendCommand(MciOpenParams.wDeviceID, MCI_PAUSE, MCI_FROM, (DWORD)&MciPlayParams);
        return;
    }
    return ;
}
播放视频
void PlayVideoFile(int iDevID)
{
    MCI_DGV_STATUS_PARMS MciStatusParams;
    MciStatusParams.dwItem = MCI_STATUS_POSITION;
    mciSendCommand(iDevID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&MciStatusParams);     MCI_DGV_PLAY_PARMS MciPlayParms;
    MciPlayParms.dwCallback = NULL;
    MciPlayParms.dwFrom = (DWORD)MciStatusParams.dwReturn;
    MciPlayParms.dwTo = ;
    mciSendCommand(iDevID, MCI_PLAY, MCI_FROM,(DWORD)&MciPlayParms);
    return;}
暂停视频
void PauseVideoFile(int iDevID)
{
    MCI_DGV_PAUSE_PARMS MciPauseParams;
    MciPauseParams.dwCallback = NULL;
    mciSendCommand(iDevID, MCI_PAUSE, NULL, (DWORD)&MciPauseParams);
}
3.系统菜单栏和下拉菜单栏的使用。
有横向菜单栏和下拉菜单两种用法,看官当心其中的区别咯
	HMENU hSYSMenu;
        hSYSMenu = CreateMenu();
        HMENU hHELPMenu;
        hHELPMenu = CreatePopupMenu();
        AppendMenu(hHELPMenu, MF_STRING, IDM_SYSMENU_OPERATE, TEXT("操作指引"));
        AppendMenu(hHELPMenu, MF_SEPARATOR, NULL, NULL);
        AppendMenu(hHELPMenu, MF_STRING, IDM_SYSMENU_ABOUT, TEXT("关于"));         AppendMenu(hSYSMenu, MF_STRING, IDM_SYSMENU_OPEN, TEXT("打开"));
        AppendMenu(hSYSMenu, MF_STRING, IDM_SYSMENU_PLAY, TEXT("播放"));
        AppendMenu(hSYSMenu, MF_STRING, IDM_SYSMENU_STOP, TEXT("暂停"));
        AppendMenu(hSYSMenu, MF_STRING, IDM_SYSMENU_CLOSE, TEXT("关闭"));
        AppendMenu(hSYSMenu, MF_STRING | MF_POPUP, (UINT_PTR)hHELPMenu, TEXT("帮助"));         SetMenu(hWnd, hSYSMenu);
普通菜单用CreateMenu创建,SetMenu生效;下拉菜单用CreatePopupMenu创建,追加菜单项都是用AppendMenu实现,将下拉菜单追加到普通菜单条目下也是用AppendMenu来实现,属性中要指定MF_POPUP和要插入的菜单句柄。
小结
播放的框架算是完成了,可大可小的一个软件,时间允许的话会再增加一些实用功能。

WIN32不得不会:视频播放器的更多相关文章

  1. 打造自己的html5视频播放器

    前段时间重新学习了一下html5的video部分,以前只是停留在标签的使用上,这一次决定深入了解相关的API,并运用这些API打造一个简单的视频播放器.所谓“打造自己的”,就是要自己重写video标签 ...

  2. linux 常见音乐、视频播放器简介

    2007-1-15 10:00:22     常见音乐播放器     xmms一族     xmms全称是X Multimedia System,这个经典的播放器可能是每个linux的使用者或多或少都 ...

  3. 音视频处理之FFmpeg+SDL视频播放器20180409

    一.FFmpeg视频解码器 1.视频解码知识 1).纯净的视频解码流程 压缩编码数据->像素数据. 例如解码H.264,就是“H.264码流->YUV”. 2).一般的视频解码流程 视频码 ...

  4. Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处。用来指定播放器 1 2. <object> 标签用于包含对象,比如图像、音

    Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处.用来指定播放器 1 2. <object> 标签用于包含对象,比如 ...

  5. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...

  6. 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案

    Chimee(读"奇米", [tʃɪ'mɪ:])是由奇舞团开源的一套 H5 视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造. Chimee ...

  7. Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...

  8. C# VLCPlayer视频播放器(附源码)

    VLCPlayer视频播放器. 支持本地播放,支持网络URL.支持全屏,截图. 基于VLCPlayer. 附带基本代码. 下载地址:http://pan.baidu.com/s/1nvjNvID

  9. 建站技能get(1)— Asp.net MVC快速集成ckplayer网页视频播放器

    故事背景大概是这样的,我厂两年前给山西晋城人民政府做了一个门户网站(地址:http://jccq.cn/),运行了一年多固若金汤,duang的有一天市场部门过来说,新闻管理模块带视频的内容播放不了了. ...

  10. 一款开源免费跨浏览器的视频播放器--videojs使用介绍

    最近项目中的视频功能,需要做到浏览器全兼容,所以之前用html5实现的视频功能就需要进行改造了.在网上翻了个遍,试来试去,在所有的视频播放器中,就数它最实际了.首先我们来看看它的优点: 1.它是开源免 ...

随机推荐

  1. SQL数据库还原时备份集中的数据库备份与现有的数据库不同的解决办法

    SQL Server 2005数据库还原出错错误具体信息为:备份集中的数据库备份与现有的A数据库不同 具体操作如下:第一次:新建了数据库A,数据库文件放在E:\DB\A目录下,选中该数据库右键-任务- ...

  2. 部分常见ORACLE面试题以及SQL注意事项

    部分常见ORACLE面试题以及SQL注意事项 一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY ...

  3. php实现自动运行文件

    autoexec.php <?php ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(30); // ...

  4. SHA-1

    https://en.wikipedia.org/wiki/SHA-1 In cryptography, SHA-1 (Secure Hash Algorithm 1) is a cryptograp ...

  5. hdu4714 Tree2cycle 把树剪成链

    题目是问把一棵树通过剪边.加边形成一个环的最小代价. 分成两步,先把树剪成一些链,再把链连接成一个环. 设一棵有n个节点的树,剪掉X条边后,形成L条链. 那么代价为X+L. n-1-X=edgeNum ...

  6. poj2月题解

    竟然生日前一天poj破百,不错不错,加速前进! poj2437 由于泥泞不重叠,所以按其实左边排个序再统计一遍即可(如果不是刚好盖满就尽量往后盖) poj2435 细节bfs poj2230 求欧拉回 ...

  7. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  8. 【转】Android中removeCallbacks失效原因

    原文网址:http://blog.sina.com.cn/s/blog_6714fba70100wtx1.html 在Android开发中会使用Handle的removeCallbacks函数,该函数 ...

  9. 【转】Cocos2d-x 弹出对话框的设计与实现

    转自:http://www.tairan.com/archives/4854 我们时常需要这么些功能,弹出一个层,给与用户一些提示,这也是一种模态窗口,在没有对当前对话框进行确认的时候,不能继续往下操 ...

  10. java vm args

    这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问题.在网上一查可能是JAVA的堆栈 ...