利用ATL製作程式多媒體封面元件 (轉)

worldblog發表於2007-12-02
利用ATL製作程式多媒體封面元件 (轉)[@more@]COM的優越就不多說,使用ATL開發COM方便而快捷,並且具有Size小,Dependency少的特點。VC++的import 編譯支援更是對COM開發的巨大支援。閒話休說,這就開始吧。
  一.Flash
        1.ATL AppWizard建立新專案"ATLFlash",選擇DLL型別。
        2.加入ATL "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 vent,  // timer identifier
 D 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
            專案設定中加入“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。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987214/,如需轉載,請註明出處,否則將追究法律責任。

相關文章