Lab > Windows Development
Windows Media Player
C++MFCSeptember 30, 2009
Table of contents
概要
Windows Media Player を埋め込む
MFC プロジェクトを作成する
新規プロジェクトで「MFC アプリケーション」を選択、すべてデフォルトで完了します。なお、ここでは Visual Studio 2005 を使用します。
プロジェクト名は「MediaPlayerTest」とします。
MFC に ATL サポートを追加する
メインメニューの「プロジェクト」から「クラス追加」を選択し、「ATL」の「MFC に ATL サポートを追加」を選択します。
コードの追加
MediaPlayerTestView.cpp に以下のコード追加します。
MediaPlayerTestView.h に以下のコード追加します。
MediaPlayerTestView クラスに以下の属性を追加します。
MediaPlayerTestView::OnCreate に以下のコードを追加します。
MediaPlayerTestView::OnSize に以下のコードを追加します。
MediaPlayerTestView::OnInitialUpdate に以下のコードを追加します。
リサイズするとちらつくので、MediaPlayerTestView::OnEraseBkgnd に以下のコードを追加します。
#import <wmp.dll> named_guids raw_interfaces_only
MediaPlayerTestView.h に以下のコード追加します。
namespace WMPLib {
interface IWMPPlayer;
interface IWMPControls;
}
MediaPlayerTestView クラスに以下の属性を追加します。
CAxWindow m_wndView; CComPtr<WMPLib::IWMPPlayer> m_spWMPPlayer; CComPtr<WMPLib::IWMPControls> m_spWMPCon;
MediaPlayerTestView::OnCreate に以下のコードを追加します。
CComPtr<IAxWinHostWindow> spHost;
m_wndView.Create(m_hWnd, CRect(0,0,0,0), NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
m_wndView.QueryHost(&spHost);
spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView, 0);
m_wndView.QueryControl(&m_spWMPPlayer);
m_spWMPPlayer->put_uiMode(CComBSTR(_T("full")));
m_spWMPPlayer->put_enableContextMenu(TRUE);
MediaPlayerTestView::OnSize に以下のコードを追加します。
if (IsWindow(m_hWnd))
{
CRect rc;
GetClientRect(&rc);
m_wndView.MoveWindow(rc);
}
MediaPlayerTestView::OnInitialUpdate に以下のコードを追加します。
CString path = GetDocument()->GetPathName();
if (PathFileExists(path))
{
CComBSTR fname = path;
m_spWMPPlayer->put_URL(fname);
}
リサイズするとちらつくので、MediaPlayerTestView::OnEraseBkgnd に以下のコードを追加します。
BOOL CMediaPlayerTestView::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
//return CView::OnEraseBkgnd(pDC);
}
MediaPlayerTestView.cpp
// MediaPlayerTestView.cpp : CMediaPlayerTestView クラスの実装
//
#include "stdafx.h"
#include "MediaPlayerTest.h"
#include "MediaPlayerTestDoc.h"
#include "MediaPlayerTestView.h"
#import <wmp.dll> named_guids raw_interfaces_only
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMediaPlayerTestView
IMPLEMENT_DYNCREATE(CMediaPlayerTestView, CView)
BEGIN_MESSAGE_MAP(CMediaPlayerTestView, CView)
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CMediaPlayerTestView コンストラクション/デストラクション
CMediaPlayerTestView::CMediaPlayerTestView()
{
// TODO: 構築コードをここに追加します。
}
CMediaPlayerTestView::~CMediaPlayerTestView()
{
}
BOOL CMediaPlayerTestView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。
return CView::PreCreateWindow(cs);
}
// CMediaPlayerTestView 描画
void CMediaPlayerTestView::OnDraw(CDC* /*pDC*/)
{
CMediaPlayerTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
}
// CMediaPlayerTestView 印刷
BOOL CMediaPlayerTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 既定の印刷準備
return DoPreparePrinting(pInfo);
}
void CMediaPlayerTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷前の特別な初期化処理を追加してください。
}
void CMediaPlayerTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷後の後処理を追加してください。
}
// CMediaPlayerTestView 診断
#ifdef _DEBUG
void CMediaPlayerTestView::AssertValid() const
{
CView::AssertValid();
}
void CMediaPlayerTestView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMediaPlayerTestDoc* CMediaPlayerTestView::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMediaPlayerTestDoc)));
return (CMediaPlayerTestDoc*)m_pDocument;
}
#endif //_DEBUG
// CMediaPlayerTestView メッセージ ハンドラ
int CMediaPlayerTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CComPtr<IAxWinHostWindow> spHost;
m_wndView.Create(m_hWnd, CRect(0,0,0,0), NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
m_wndView.QueryHost(&spHost);
spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView, 0);
m_wndView.QueryControl(&m_spWMPPlayer);
m_spWMPPlayer->put_uiMode(CComBSTR(_T("full")));
m_spWMPPlayer->put_enableContextMenu(TRUE);
return 0;
}
void CMediaPlayerTestView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (IsWindow(m_hWnd))
{
CRect rc;
GetClientRect(&rc);
m_wndView.MoveWindow(rc);
}
}
void CMediaPlayerTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CString path = GetDocument()->GetPathName();
if (PathFileExists(path))
{
CComBSTR fname = path;
m_spWMPPlayer->put_URL(fname);
}
}
BOOL CMediaPlayerTestView::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
//return CView::OnEraseBkgnd(pDC);
}
ダウンロード