mpc 学习1

本文详细介绍了MPlayerC播放器的架构设计与实现原理,包括CwndApp文件mplayerc.h中初始化实例的过程、MainWnd文件MainFrame.Cpp中的事件处理及窗口创建流程、FGManager.cpp文件中智能链接过程的实现,以及option属性项等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四章 播放器

4.1 CwndApp 文件mplayerc.h

BOOL CMPlayerCApp::InitInstance()

使用Detour库进行函数截获。使用指定函数替换目标函数。

//命令行参数处理

CAtlList<CString> m_cmdln;格式化命令行参数。

//配置类

class Settings

//配置类分析命令行参数

m_s.ParseCommandLine(m_cmdln);

//根据命令行做相应的处理

//互斥量,只运行一个实例

m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);

//创建主窗口

CMainFrame* pFrame = new CMainFrame;

//菜单消息的处理:
BEGIN_MESSAGE_MAP(CMPlayerCApp, CWinApp)

       //{{AFX_MSG_MAP(CMPlayerCApp)

       ON_COMMAND(ID_HELP_ABOUT, OnAppAbout)

       ON_COMMAND(ID_FILE_EXIT, OnFileExit)

       //}}AFX_MSG_MAP

       ON_COMMAND(ID_HELP_SHOWCOMMANDLINESWITCHES, OnHelpShowcommandlineswitches)

END_MESSAGE_MAP()

4.2   MainWnd 文件MainFrame.Cpp

class CMainFrame : public CFrameWnd, public CDropTarget

事件处理函数:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

//弹出菜单

m_popup.LoadMenu(IDR_POPUP);

m_popupmain.LoadMenu(IDR_POPUPMAIN);

//主菜单

GetMenu()->ModifyMenu(ID_FAVORITES, MF_BYCOMMAND|MF_STRING, IDR_MAINFRAME, ResStr(IDS_FAVORITES_POPUP));

//创建视图窗口

if(!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

              CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))

       {

              TRACE0("Failed to create view window/n");

              return -1;

       }

///创建状态条 static bars

m_bars

// 进度条

m_wndSeekBar.Enable(false);

// dockable bars

m_dockingbars

//创建线程

CGraphThread

BEGIN_MESSAGE_MAP(CGraphThread, CWinThread)

ON_THREAD_MESSAGE(TM_EXIT, OnExit)

ON_THREAD_MESSAGE(TM_OPEN, OnOpen)

ON_THREAD_MESSAGE(TM_CLOSE, OnClose)

END_MESSAGE_MAP()

异步处理这三个事情

消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_COMMAND(ID_FAVORITES_ADD, OnFavoritesAdd)

ON_UPDATE_COMMAND_UI(ID_FAVORITES_ADD, OnUpdateFavoritesAdd)

END_MESSAGE_MAP()

 

//菜单响应:

打开媒体文件
void CMainFrame::OnFileOpenmedia()

发消息给线程:

m_pGraphThread->PostThreadMessage(CGraphThread::TM_OPEN, 0, (LPARAM)pOMD.Detach());

调用:

bool CMainFrame::OpenMediaPrivate(CAutoPtr<OpenMediaData> pOMD)

调用:

void CMainFrame::OpenFile(OpenFileData* pOFD)

调用:

STDMETHODIMP CFGManager::RenderFile(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrPlayList)

实现智能链接的过程的。

 

4.3  文件FGManager.cpp 实现IGraphBuilder2的过程

 

STDMETHODIMP CFGManager::RenderFile(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrPlayList)

A、 查找SourceFilter

EnumSourceFilters

B、 STDMETHODIMP CFGManager::ConnectFilter(IBaseFilter* pBF, IPin* pPinIn)

CSTDMETHODIMP CFGManager::Connect(IPin* pPinOut, IPin* pPinIn)

 

总之就是很复杂的过程

4.4   option 属性项 ppagesheet

 

4.4 、其它

SetupFiltersSubMenu 创建Filter信息

获取filter的属性页显示

int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值