X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ae3c17b4013e80b99976c750c19fca47729517f6..7e08bc5acd8ee4e2f0756f50bf98937a118f9951:/interface/wx/msw/ole/activex.h diff --git a/interface/wx/msw/ole/activex.h b/interface/wx/msw/ole/activex.h index 84dd86c428..19f50d265d 100644 --- a/interface/wx/msw/ole/activex.h +++ b/interface/wx/msw/ole/activex.h @@ -8,33 +8,45 @@ /** @class wxActiveXEvent - @headerfile ole/activex.h wx/msw/ole/activex.h - An event class for handling activex events passed from wxActiveXContainer. + An event class for handling ActiveX events passed from wxActiveXContainer. ActiveX events are basically a function call with the parameters passed through an array of wxVariants along with a return value that is a wxVariant itself. What type the parameters or return value are depends on the context (i.e. what the .idl specifies). - Note that unlike the third party wxActiveX function names are not supported. + @beginEventTable{wxActiveXEvent} + @event{EVT_ACTIVEX(func)} + Sent when the ActiveX control hosted by wxActiveXContainer recieves an + ActiveX event. + @endEventTable + + ActiveX event parameters can get extremely complex and may be beyond the + abilities of wxVariant. If 'operator[]' fails, prints an error messages or + crashes the application, event handlers should use GetNativeParameters() + instead to obtain the original event information. + Calls to operator[] and GetNativeParmeters() can be mixed. It is valid + to handle some parameters of an event with operator[] and others directly + through GetNativeParameters(). It is \b not valid however to manipulate + the same parameter using both approaches at the same time. @onlyfor{wxmsw} - @library{wxbase} - @category{FIXME} + @library{wxcore} + @category{events} */ class wxActiveXEvent : public wxCommandEvent { public: /** - Returns the dispatch id of this activex event. This is the numeric value from - the .idl file specified by the id(). + Returns the dispatch id of this ActiveX event. + This is the numeric value from the .idl file specified by the id(). */ DISPID GetDispatchId(int idx) const; /** - Obtains the number of parameters passed through the activex event. + Obtains the number of parameters passed through the ActiveX event. */ size_t ParamCount() const; @@ -52,47 +64,237 @@ public: Obtains the actual parameter value specified by idx. */ wxVariant operator[](size_t idx); + + /** + Obtain the original MSW parameters for the event. + Event handlers can use this information to handle complex event parameters + that are beyond the scope of wxVariant. + The information returned here is the information passed to the original + 'Invoke' method call. + \return a pointer to a struct containing the original MSW event parameters + */ + wxActiveXEventNativeMSW *GetNativeParameters() const; }; /** @class wxActiveXContainer - @headerfile ole/activex.h wx/msw/ole/activex.h - wxActiveXContainer is a host for an activex control on Windows (and - as such is a platform-specific class). Note that the HWND that the class - contains is the actual HWND of the activex control so using dynamic events - and connecting to wxEVT_SIZE, for example, will recieve the actual size - message sent to the control. + wxActiveXContainer is a host for an ActiveX control on Windows (and as such + is a platform-specific class). + + Note that the HWND that the class contains is the actual HWND of the ActiveX + control so using dynamic events and connecting to wxEVT_SIZE, for example, + will receive the actual size message sent to the control. It is somewhat similar to the ATL class CAxWindow in operation. - The size of the activex control's content is generally gauranteed to be that + The size of the ActiveX control's content is generally guaranteed to be that of the client size of the parent of this wxActiveXContainer. - You can also process activex events through wxEVT_ACTIVEX or the - corresponding message map macro EVT_ACTIVEX. + You can also process ActiveX events through wxActiveXEvent. + + + @section activexcontainer_example Example + + This is an example of how to use the Adobe Acrobat Reader ActiveX control to + read PDF files (requires Acrobat Reader 4 and up). + Controls like this are typically found and dumped from OLEVIEW.exe that is + distributed with Microsoft Visual C++. + This example also demonstrates how to create a backend for wxMediaCtrl. + + @code + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // + // wxPDFMediaBackend + // + // http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/iac/IACOverview.pdf + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + #include "wx/mediactrl.h" // wxMediaBackendCommonBase + #include "wx/msw/ole/activex.h" // wxActiveXContainer + #include "wx/msw/ole/automtn.h" // wxAutomationObject + + const IID DIID__DPdf = {0xCA8A9781,0x280D,0x11CF,{0xA2,0x4D,0x44,0x45,0x53,0x54,0x00,0x00}}; + const IID DIID__DPdfEvents = {0xCA8A9782,0x280D,0x11CF,{0xA2,0x4D,0x44,0x45,0x53,0x54,0x00,0x00}}; + const CLSID CLSID_Pdf = {0xCA8A9780,0x280D,0x11CF,{0xA2,0x4D,0x44,0x45,0x53,0x54,0x00,0x00}}; + + class WXDLLIMPEXP_MEDIA wxPDFMediaBackend : public wxMediaBackendCommonBase + { + public: + wxPDFMediaBackend() : m_pAX(NULL) {} + virtual ~wxPDFMediaBackend() + { + 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_Pdf, NULL, + CLSCTX_INPROC_SERVER, + DIID__DPdf, (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, + DIID__DPdf, + pDispatch); + + wxPDFMediaBackend::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) + { + if(m_PDF.CallMethod("LoadFile", fileName).GetBool()) + { + m_PDF.CallMethod("setCurrentPage", wxVariant((long)0)); + NotifyMovieLoaded(); // initial refresh + wxSizeEvent event; + m_pAX->OnSize(event); + return true; + } + + return false; + } + virtual bool Load(const wxURI& location) + { + return m_PDF.CallMethod("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("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)) + { + } + 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("setShowToolbar", true); + m_PDF.CallMethod("setShowScrollbars", true); + } + else + { + m_PDF.CallMethod("setShowToolbar", false); + m_PDF.CallMethod("setShowScrollbars", false); + } + + return true; + } + + wxActiveXContainer* m_pAX; + wxAutomationObject m_PDF; + + DECLARE_DYNAMIC_CLASS(wxPDFMediaBackend) + }; + + IMPLEMENT_DYNAMIC_CLASS(wxPDFMediaBackend, wxMediaBackend); + Put this in one of your existant source files and then create a wxMediaCtrl with + + //[this] is the parent window, "myfile.pdf" is the PDF file to open + wxMediaCtrl* mymediactrl = new wxMediaCtrl(this, "myfile.pdf", wxID_ANY, + wxDefaultPosition, wxSize(300,300), + 0, "wxPDFMediaBackend"); + @endcode + @onlyfor{wxmsw} @library{wxbase} - @category{FIXME} + @category{misc,ipc} - @see wxActiveXEvent + @see wxActiveXEvent, @ref page_samples_flash */ class wxActiveXContainer : public wxControl { public: /** - Creates this activex container. + Creates this ActiveX container. @param parent - parent of this control. Must not be @NULL. + parent of this control. Must not be @NULL. @param iid - COM IID of pUnk to query. Must be a valid interface to an activex control. + COM IID of pUnk to query. Must be a valid interface to an ActiveX control. @param pUnk - Interface of activex control. + Interface of ActiveX control. */ wxActiveXContainer(wxWindow* parent, REFIID iid, IUnknown* pUnk); };