在中Visual Studio .NET 2003利用DirectShow播放媒体文件(五)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

浏览、播放、暂停、关闭四按钮的相应事件响应函数如下:

void CPlayWndDlg::OnBnClickedBrowseButton()

{

    CFileDialog dlgFile(TRUE, NULL, NULL,

       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

       "Movie Files (*.avi;*.mpg;*.mpeg) |/

       *.avi;*.mpg;*.mpeg |/

       Audio Files (*.wav;*mp3;*.mpa;*.mpu;*.au) |/

       *.wav;*.mp3;*.mpa;*.mpu;*.au |/

       Midi Files (*.mid;*.midi;*.rmi) |/

       *.mid;*.midi;*.rmi| | ", this);

 

    if(dlgFile.DoModal() == IDOK)

    {

       m_strMediaFile  = dlgFile.GetPathName();

       GetDlgItem(IDC_MEDIAFILE_EDIT)->SetWindowText(m_strMediaFile);

    }

    else

       return;

 

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);

    HRESULT hr = m_pGraph->RenderFile(CA2W(m_strMediaFile), NULL);

    if(FAILED(hr))

    {

       char szMsg[200];

       AMGetErrorText(hr, szMsg, sizeof(szMsg));

       AfxMessageBox(szMsg);

    }

 

    //指定父窗体

    IVideoWindow* pVidWin = NULL;

    m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

    pVidWin->put_Owner((OAHWND)m_hWnd);

    pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

 

    CRect rc;

    GetDlgItem(IDC_VW_FRAME)->GetWindowRect(rc);

    ScreenToClient(rc);

    pVidWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());

 

    // 注意此处Filter Graph Manager的事件以WM_GRAPHNOTIFY发出(用户定义的消息).

    m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);

    m_pEvent->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0);

 

    // 设置Seeking

    m_pGraph->QueryInterface(IID_IMediaSeeking, (void **)&m_pMediaSeeking);

 

}

 

void CPlayWndDlg::OnBnClickedPlayButton()

{

    Play();

}

 

void CPlayWndDlg::OnBnClickedPauseButton()

{

    m_pMediaControl->Pause();

 

    m_isPlaying = TRUE;

    GetDlgItem(IDC_PLAY_BUTTON)->EnableWindow(TRUE);

    GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(FALSE);

}

 

void CPlayWndDlg::OnBnClickedCancel()

{

    // TODO: 在此添加控件通知处理程序代码

    CleanUp();

    OnCancel();

}

8.添加对WM_GRAPHNOTIFY消息,及其响应函数

PlayWndDlg添加消息ID定义:

#define WM_GRAPHNOTIFY WM_USER + 101

PlayWndDlg.h中,代码如下:

// 实现

protected:

    HICON m_hIcon;

 

    // 生成的消息映射函数

    virtual BOOL OnInitDialog();

    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg void OnPaint();

    afx_msg HCURSOR OnQueryDragIcon();

    DECLARE_MESSAGE_MAP()

    afx_msg HRESULT OnGraphNotify(WPARAM wParam,LPARAM lParam);

private:

    IGraphBuilder *m_pGraph;

    IMediaControl *m_pMediaControl;

    IMediaEventEx *m_pEvent;

PlayWndDlg.cpp,如下:

    ON_BN_CLICKED(IDC_BROWSE_BUTTON, OnBnClickedBrowseButton)

    ON_BN_CLICKED(IDC_PLAY_BUTTON, OnBnClickedPlayButton)

    ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnBnClickedPauseButton)

    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)

    ON_MESSAGE(WM_GRAPHNOTIFY, OnGraphNotify)

END_MESSAGE_MAP()

 

实现如下:

HRESULT CPlayWndDlg::OnGraphNotify(WPARAM wParam,LPARAM lParam)

{

    long levCode, lparam1, lparam2;

    HRESULT hr;

    while (hr = m_pEvent->GetEvent(&levCode, &lparam1, &lparam2, 0), SUCCEEDED(hr))

    {

        hr = m_pEvent->FreeEventParams(levCode, lparam1, lparam2);

        if ((EC_COMPLETE == levCode) || (EC_USERABORT == levCode))

        {

            TRACE("End of the media file!!./n");

            Stop();

            //CleanUp();

            break;

        }

    }

 

    return hr;

}

 有需要者可以与我索取源码

深入 .NET 四大核心 —— 反射、IoC、DI、AOP 的源码级剖析与工程落地 反射、IoC、DI、AOP 这四个词,单独看每个都像是"面试八股",但串起来看,它们是一条从"能跑"到"可维护、可测试、可演进"的完整工程路径.NET 在运行时是自描述的,元数据是一切动态能力的基石;控制权的转移是解耦的前提,让框架去关心对象的生与死;依赖声明应该是显式的契约,容器是这份契约的执行者;重复的代码一定有抽象的空间,横切逻辑可以被优雅地抽离。理解了这套体系,你看 ASP.NET Core 的源码不再是黑盒,写业务代码时会本能地问"这个依赖该不该注入"、“这个横切逻辑该放哪一层”。 阅读详情

相关推荐

ASP.NET Core 8 Minimal API 认证示例,核心用 BCrypt.Net​ 做密码哈希 + JWT​ 做身份认证。

return Results.Ok(new { username = name, message = "已通过认证,这是你的个人数据" });Console.WriteLine($"但都能校验通过: {BCrypt.Verify(password, hash2)}");return Results.BadRequest(new { message = "用户名和密码不能为空" });// 内存用户仓储(演示用,生产请换 EF Core + 数据库)// ===== 4. 受保护接口(需 JWT)=====

A_nanda的博客 194

visual studio 2003下编译通过的x264代码,加入支持mp4转换

本代码在visual studio 2003下编译通过,内附详细编译说明。希望对x264编码感兴趣的朋友有所帮助。

用 C# 和 .NET 10 手搓一个内网穿透(附极简示例 + 可试用客户端)

最近在折腾内网穿透,用 C# 写了一套小东西,服务端跑在一台公网小机器上,客户端一行命令就能把家里的 3389、8080 之类的端口暴露到公网。整个过程基于 .NET 10,代码量不大,原理也简单,写篇博文记录一下。

火焰 105

dshow中playwnd的改写

为了熟悉代码,把playwnd从win32改成mfc,代码的复制与粘贴,没什么新功能添加,以后有机会再添加效果图 

CP9的专栏 1109

在中Visual Studio .NET 2003利用DirectShow播放媒体文件()

 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体的捕捉和回放提供了强有力的支持。运用DirectShow我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数

sunjin007的专栏 2118

在中Visual Studio .NET 2003利用DirectShow播放媒体文件()

// IDC_VW_FRAME控件Picture Control主要作用是控制Vedio Window的显示位置void CPlayWndDlg::MoveVideoWindow(void){    IVideoWindow* pVideoWinow = NULL;    if(m_pGraph)    {       m_pGraph->QueryInterface(II

sunjin007的专栏 1301

在中Visual Studio .NET 2003利用DirectShow播放媒体文件()

3.设置工程属性    项目→PlayWnd属性→配置属性→链接器→输入→附加依赖项,添加库文件Strmiids.lib 和Quartz.lib。由于Dshow.h头文件是在任何DirectShow工程中都要用到的,因此我们stdafx.h加入如下行:#include  4.设计对话框,如下: IDC_STATIC控件类型Stat

sunjin007的专栏 1119

在中Visual Studio .NET 2003利用DirectShow播放媒体文件()

CPlayWndDlg的构造函数中添加初始化代码CPlayWndDlg::CPlayWndDlg(CWnd* pParent /*=NULL*/)    : CDialog(CPlayWndDlg::IDD, pParent){    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);     m_pGraph 

sunjin007的专栏 1095

Visual C++.NET DirectShow编程

Visual C++.NET DirectShow编程作者: 时间: 2004年4月14日 15:28:51 来源:天极论坛    DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体的捕捉和回放提供了强有力的支持。运用DirectShow我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相

wangyh专栏 1234

.NET新特性·第17篇】EF Core 10 与 Aspire 13.1

EFCore 10 引入复杂类型JSON映射、命名查询过滤器、批量操作增强等特性,提升数据访问效率与灵活性;Aspire 13.1深化Azure/AWS集成,支持Redis作为LLM缓存,Dashboard可观测性升级,助力云原生与AI应用开发。

hanzhixintianxia的博客 217

C# .NET 周刊 |2026 年 8 月 4 期

本文介绍了用 C#、WinForm、WebView2、HTML 和 CSS 构建管理系统界面的方案。它强调用 WebView2 连接原生窗体和网页界面,实现数据传递、事件通知和样式切换,适合用户、权限、日志、报表等常见后台场景。方案思路清晰,实用性较强,但技术深度和原创细节一般,缺少实现代码和性能分析。

InCerry的博客 282

.NET 异步编程体系

本文模型——Task、TAP、async/await、CancellationToken、SemaphoreSlim、SynchronizationContext——对 **.NET Framework 4.8** 同样成立;文中提到的 ValueTask、异步流 `IAsyncEnumerable<T>` 等属于现代 .NET.NET Core/.NET 5+)的进一步扩展。Microsoft 将这套官方推荐的异步编程模型称为 **Task-based Asynchronous Pattern(TAP,

MzKyle的博客 1194

.NET 报表控件选型指南:2026 年 6 款 OEE 报表组件初筛对比

制造业 MES 团队做 OEE 报表时,常卡在"实时大屏"与"可归档打印"两类相反诉求如何兼顾。本文面向 .NET 技术栈,梳理 Stimulsoft、FastReport、ActiveReports、DevExpress Reporting、Grid++Report、HighReport 六款报表组件在实时大屏、快照归档、定时调度、最终用户设计器、AI 辅助与国产化部署上的能力边界,以"条件筛选"替代综合排名,给出可进入 PoC 的初筛候选名单,并附对比表、价格量级与统一 PoC 验证清单。

励志做最业余的专业博主,控件产品可以私我~ 274

.NET 报表控件选型对比:Stimulsoft 与 FastReport 怎么选

.NET 报表控件选型怎么落地?以 Stimulsoft 与 FastReport 两款主流引擎为案例,本文不评优劣,只做场景分流:用 5 个自测问题加一张 2026 年官方能力对照表,把「实时大屏 / AI 集成」与「打印归档 / 合规发票 / 开源起步」两类需求分别对号入座,并附自研、Power BI、RDLC 三个参照系的边界说明。

励志做最业余的专业博主,控件产品可以私我~ 122

基于 C# / .NET 8 + Windows Forms + SQLite 的桌面银行业务演示系统——华夏示范银行管理系统

华夏示范银行管理系统是一款基于C#/.NET8+WindowsForms+SQLite的桌面端业务演示系统,采用分层架构设计,支持超级管理员、管理员与客户三类角色。系统集成登录认证、顶部导航、客户/产品管理、持仓价值计算、操作日志双写(SQLite+文本)、空闲自动登出及数据导出功能。通过“内容控件+按钮栏”组合模式实现页面动态扩展,支持自定义页配置与灵活功能开关,具备高可维护性与可拓展性,适用于银行业务流程教学与原型验证。

weixin_66547608的博客 163

微软技术日报 2026-09-10:Project Zenith 开发者设备亮相,.NET 11 RC1 可投产

今天的微软把重心放在「开发者的一公里」:设备端(Project Zenith)、运行时(.NET 11 RC1)、模型层(Copilot 多模型矩阵)三层同时发力,开发者环境从"自己搭"走向"买来就能写"。参考来源:微软官方博客(Project Zenith)、.NET 官方发布说明、TechRepublic、腾讯新闻科技频道、第一财经、IT之家。本文由 AI 辅助整理,仅覆盖技术动态,不含财务信息。

海盗Sharp的博客 391

.NET 9.0 项目升级到 .NET 10.0

关于.NET项目升级到.NET10的步骤,包括改目标框架、重新生成、升级NuGet包、处理版本冲突等。 本文介绍.NET项目升级至.NET10.0的完整流程:修改目标框架、重新生成、升级NuGet包,并处理包版本依赖冲突问题。提供详细操作指南与参考文章,帮助开发者顺利完成升级。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 422
上一篇: 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(四)
下一篇: 视频捕获 之 如何使用系统设备枚举器
sunjin007
博客等级 码龄22年 1粉丝 6原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值