第四章 播放器
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)
C、STDMETHODIMP CFGManager::Connect(IPin* pPinOut, IPin* pPinIn)
总之就是很复杂的过程
4.4 option 属性项 ppagesheet
4.4 、其它
SetupFiltersSubMenu 创建Filter信息
获取filter的属性页显示
int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)