-- 作者:卷积内核
-- 发布时间:10/24/2008 8:54:00 AM
-- 利用ATL制作程序多媒体封面组件
COM的优越就不多说,使用ATL开发COM方便而快捷,并且具有Size小,Dependency少的特点。VC++的import 编译支持更是对COM开发的巨大支持。闲话休说,这就开始吧。 一.Flash组件 1.ATL COM AppWizard创建新项目"ATLFlash",选择DLL类型。 2.加入ATL Object "Flash" Insert -> New ATL Object 选择Object中的Simple Object, Short Name:“FLash” 3.接口添加Method “Play” 参数为:[in]BSTR bstrFile,[in]long hInstance,[in]long hWnd 4.在CFlash类中加入: private: HWND m_hWnd;//视频窗口句柄 5. 实现Play方法。 STDMETHODIMP CFlash::Play(BSTR bstrFile, long hInstance, long hWnd) { try{ m_hMCIWnd=(HWND)hWnd; _bstr_t file(bstrFile); m_hMCIWnd=::MCIWndCreate((HWND)hWnd,(HINSTANCE)hInstance, WS_POPUP¦WS_VISIBLE¦ MCIWNDF_NOPLAYBAR¦ MCIWNDF_NOMENU, (char *)file); RECT rect; int sx,sy; ::GetWindowRect(m_hMCIWnd,&rect); sx=(::GetSystemMetrics(SM_CXSCREEN) -rect.right+rect.left)/2; sy=(::GetSystemMetrics(SM_CYSCREEN) -rect.bottom+rect.top)/2; //窗口居中 ::SetWindowPos(m_hMCIWnd,HWND_TOPMOST,sx, sy,0,0,SWP_SHOWWINDOW¦SWP_NOSIZE); g_nLength=MCIWndGetLength(m_hMCIWnd); MCIWndPlay(m_hMCIWnd); SetTimer(m_hMCIWnd,1,50,TimerProc); }catch(...) { AtlTrace("error:%ul",::GetLastError()); } return S_OK; } 6.Flash.cpp中实现TimerProc,用于关闭视频窗口。 long g_nLength; VOID CALLBACK TimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ) { long nLength; BOOL bEscape=::GetKeyState(VK_ESCAPE)&0x0100; nLength=MCIWndGetPosition(hwnd); //视频放完,或点击ESC键,关闭视频窗口 if((nLength>=g_nLength)¦¦(bEscape)){ KillTimer(hwnd,idEvent); MCIWndEnd(hwnd); MCIWndClose(hwnd); MCIWndDestroy(hwnd); } }; 7.stdafx.h中加入 #include <vwf.h> 项目设置中加入“vwf32.lib”库, 打开项目设置中C++,C++language中的Enable Error Handling 编译,一切OK。 二,组件的使用。 1.创建一个MDI或SDI项目"FlashClient" 2.stdafx.h中加入 #import “ATLFlash.dll” no_namespace FlashCient.cpp中加入 struct _InitCom{ _InitCom(){::CoInitialize(NULL);} ~_InitCom(){::CoUninitialize(); } }__InitCom; 3.CFlashClientView加入 private: IFlashPtr pFlashServer; 4.CFlashClent::OnInitialUpdate()加入 _bstr_t file("Sample.avi"); pFlashServer->Play( file,(long)::AfxGetInstanceHandle(),(long)this->GetSafeHwnd()); 5.编译,一切OK。
|