1

wxMediaCtrlを使ってwxWidgetsでswfファイルを再生したいです。インターネットで検索したところ、このリンクwxMediaCtrl backend for flash.ocxが見つかりました。次に、adobe Shockwaveflash と adobe flash をインストールし、mysample プロジェクトに実装しましたが、wxMediaCtrl 再生 swf ファイルが表示されません。(以前の英語で申し訳ありません)、今はコードブロック 10_05 と wxWidgets-2.8.12 を使用しているので、これが私のコードです:

LLS_MediaPlay.h のコード

#include "wx/mediactrl.h"
#include "wx/msw/ole/activex.h" // wxActiveXContainer
#include "wx/msw/ole/automtn.h" // wxAutomationObject

const IID IID_Flash = {0xD27CDB6C,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};
const CLSID CLSID_Flash = {0xD27CDB6E,0xAE6D,0x11cf,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};
class WXDLLIMPEXP_MEDIA wxFlashMediaBackend : public wxMediaBackendCommonBase
{
public:
wxFlashMediaBackend() : m_pAX(NULL) {}
virtual ~wxFlashMediaBackend()
{
    if(m_pAX)
    {
        m_pAX->DissociateHandle();
        delete m_pAX;
    }
}

virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name)
{
    IDispatch* pDispatch;
    if( ::CoCreateInstance(CLSID_Flash, NULL, CLSCTX_INPROC_SERVER, IID_Flash, (void**)&pDispatch) != 0)
        return false;

    m_PDF.SetDispatchPtr(pDispatch); // wxAutomationObject will release itself

    if (!ctrl->wxControl::Create(parent, id, pos, size,(style & ~wxBORDER_MASK) | wxBORDER_NONE, validator, name))
        return false;
    m_ctrl = wxStaticCast(ctrl, wxMediaCtrl);
    m_pAX = new wxActiveXContainer(ctrl, IID_Flash, pDispatch);
    wxFlashMediaBackend::ShowPlayerControls(wxMEDIACTRLPLAYERCONTROLS_NONE);
    return true;
}

virtual bool Play()
{
    return true;
}

virtual bool Pause()
{
    return true;
}

virtual bool Stop()
{
    return true;
}

virtual bool Load(const wxString& filename)
{
    m_PDF.CallMethod(_T("LoadFile"),"1",filename);
    NotifyMovieLoaded();
    wxSizeEvent event;
    m_pAX->OnSize(event);
    return true;
}

virtual bool Load(const wxURI& location)
{
    return m_PDF.CallMethod(_T("LoadFile"), location.BuildUnescapedURI()).GetBool();
}

virtual bool Load(const wxURI& WXUNUSED(location), const wxURI& WXUNUSED(proxy))
{
    return false;
}

virtual wxMediaState GetState()
{
    return wxMEDIASTATE_STOPPED;
}

virtual bool SetPosition(wxLongLong where)
{
    m_PDF.CallMethod(_T("setCurrentPage"), wxVariant((long)where.GetValue()));
    return true;
}

virtual wxLongLong GetPosition()
{
    return 0;
}

virtual wxLongLong GetDuration()
{
    return 0;
}

virtual void Move(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(w), int WXUNUSED(h))
{

}

virtual wxSize GetVideoSize() const
{
    return wxDefaultSize;
}

virtual double GetPlaybackRate()
{
    return 0;
}

virtual bool SetPlaybackRate(double)
{
    return false;
}

virtual double GetVolume()
{
    return 0;
}

virtual bool SetVolume(double)
{
    return false;
}

virtual bool ShowPlayerControls(wxMediaCtrlPlayerControls flags)
{
    if(flags)
    {
        m_PDF.CallMethod(_T("setShowToolbar"), true);
        m_PDF.CallMethod(_T("setShowScrollbars"), true);
    }
    else
    {
        m_PDF.CallMethod(_T("setShowToolbar"), false);
        m_PDF.CallMethod(_T("setShowScrollbars"), false);
    }
    return true;
}
wxActiveXContainer* m_pAX;
wxAutomationObject m_PDF;

DECLARE_DYNAMIC_CLASS(wxFlashMediaBackend)
};

 class LLS_MediaPlay: public wxFrame
 {
public:

    LLS_MediaPlay(wxWindow* parent,wxWindowID id=wxID_ANY);
    virtual ~LLS_MediaPlay();
    void OnplayvideoButtonClick(wxCommandEvent& event);
    wxMediaCtrl *mediaplayer;

    //(*Declarations(LLS_MediaPlay)
    //*)

protected:

    //(*Identifiers(LLS_MediaPlay)
    //*)

private:

    //(*Handlers(LLS_MediaPlay)
    //*)
    static const long ID_MEDIACTRL1;


    DECLARE_EVENT_TABLE()
 };

LLS_MediaPlay.cpp のこのコード:

 mediaplayer = new wxMediaCtrl(this, ID_MEDIACTRL1, _T("G:\\hendy\\animation\\gas.swf"), wxPoint(5,5), wxSize(1000,400), 0, _T("wxFlashMediaBackend"), wxDefaultValidator, _T("SWF Player"));

Connect(ID_MEDIACTRL1, wxEVT_MEDIA_PLAY, (wxObjectEventFunction)&LLS_MediaPlay::OnplayvideoButtonClick);

 void LLS_MediaPlay::OnplayvideoButtonClick(wxCommandEvent& event)
 {
     // is it mediaplayer->Show(); ??
 }

このコードをコンパイルしてもエラーは発生しませんが、 wxFlashMediaBackendが gas.swf ファイルを再生していることを示していません。空の白いフレームが表示されていますが、そのフレームを右クリックするとポップアップ メニューが表示されます Adob​​e Flash Player 11.8.800.94 について...

誰かが私がどこで間違いをしているのか教えてもらえますか?

本当は空の白枠の画像を表示したいのですが、その画像を表示することについて 10 の評判がありません。そのために残念。しかし、誰かが私を助けることができますか? なぜこれが起こっているのかについての洞察は非常に高く評価されます。

ありがとう。

4

1 に答える 1

1

はい、ついに解決策を見つけました。コードブロック 10_05 またはコードブロック 12-11 で wxwidgets-2.8.12 を使用して、swf / flash ファイルを再生できるようになりました。

これを LLS_MediaPlay.cpp に追加するだけです:

Connect(ID_MEDIACTRL1, wxEVT_ACTIVEX, (wxObjectEventFunction)&LLS_MediaPlay::OnplayvideoButtonClick);

と OnplayvideoButtonClick メソッド、私はこれを追加します:

mediaplayer->Play();

だから、そのように!Windows プラットフォームで swf ファイルを再生できるようになりました。

于 2013-07-18T02:49:32.043 に答える