1f7d05f019
Closes #13784. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70361 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
315 lines
10 KiB
Objective-C
315 lines
10 KiB
Objective-C
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: msw/ole/activex.h
|
|
// Purpose: interface of wxActiveXEvent
|
|
// Author: wxWidgets team
|
|
// RCS-ID: $Id$
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/**
|
|
@class wxActiveXEvent
|
|
|
|
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).
|
|
|
|
@beginEventTable{wxActiveXEvent}
|
|
@event{EVT_ACTIVEX(func)}
|
|
Sent when the ActiveX control hosted by wxActiveXContainer receives 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{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().
|
|
*/
|
|
DISPID GetDispatchId(int idx) const;
|
|
|
|
/**
|
|
Obtains the number of parameters passed through the ActiveX event.
|
|
*/
|
|
size_t ParamCount() const;
|
|
|
|
/**
|
|
Obtains the param name of the param number idx specifies as a string.
|
|
*/
|
|
wxString ParamName(size_t idx) const;
|
|
|
|
/**
|
|
Obtains the param type of the param number idx specifies as a string.
|
|
*/
|
|
wxString ParamType(size_t idx) const;
|
|
|
|
/**
|
|
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
|
|
|
|
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 @c 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 guaranteed to be that
|
|
of the client size of the parent of this wxActiveXContainer.
|
|
|
|
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;
|
|
|
|
wxDECLARE_DYNAMIC_CLASS(wxPDFMediaBackend)
|
|
};
|
|
|
|
wxIMPLEMENT_DYNAMIC_CLASS(wxPDFMediaBackend, wxMediaBackend);
|
|
|
|
// Put this in one of your existing source files and then create a wxMediaCtrl with
|
|
wxMediaCtrl* mymediactrl = new wxMediaCtrl(this, "myfile.pdf", wxID_ANY,
|
|
wxDefaultPosition, wxSize(300,300),
|
|
0, "wxPDFMediaBackend");
|
|
// [this] is the parent window, "myfile.pdf" is the PDF file to open
|
|
@endcode
|
|
|
|
|
|
@onlyfor{wxmsw}
|
|
|
|
@library{wxbase}
|
|
@category{ctrl,ipc}
|
|
|
|
@see wxActiveXEvent, @ref page_samples_flash
|
|
*/
|
|
class wxActiveXContainer : public wxControl
|
|
{
|
|
public:
|
|
/**
|
|
Creates this ActiveX container.
|
|
|
|
@param parent
|
|
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.
|
|
@param pUnk
|
|
Interface of ActiveX control.
|
|
*/
|
|
wxActiveXContainer(wxWindow* parent, REFIID iid, IUnknown* pUnk);
|
|
/**
|
|
Queries host's site for interface.
|
|
|
|
@param iid
|
|
The iid of the required interface.
|
|
@param _interface
|
|
Double pointer to outgoing interface. Supply your own interface if desired.
|
|
@param desc
|
|
The description of the outgoing interface.
|
|
@return bool
|
|
Return true if interface supplied else return false.
|
|
*/
|
|
virtual bool QueryClientSiteInterface(REFIID iid, void **_interface, const char *&desc);
|
|
};
|
|
|