📄 wxactivex.h
字号:
}
/// Main class for embedding a ActiveX control.
/// Use by itself or derive from it
/// \note The utility program (wxie) can generate a list of events, methods & properties
/// for a control.
/// First display the control (File|Display),
/// then get the type info (ActiveX|Get Type Info) - these are copied to the clipboard.
/// Eventually this will be expanded to autogenerate
/// wxWindows source files for a control with all methods etc encapsulated.
/// \par Usage:
/// construct using a ProgId or class id
/// \code new wxActiveX(parent, CLSID_WebBrowser, id, pos, size, style, name)\endcode
/// \code new wxActiveX(parent, "ShockwaveFlash.ShockwaveFlash", id, pos, size, style, name)\endcode
/// \par Properties
/// Properties can be set using \c SetProp() and set/retrieved using \c Prop()
/// \code SetProp(name, wxVariant(x)) \endcode or
/// \code wxString Prop("<name>") = x\endcode
/// \code wxString result = Prop("<name>")\endcode
/// \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
/// \code flash_ctl.Prop("Playing") = false;\endcode
/// \code wxString current_movie = flash_ctl.Prop("movie");\endcode
/// \par Methods
/// Methods are invoked with \c CallMethod()
/// \code wxVariant result = CallMethod("<name>", args, nargs = -1)\endcode
/// \code wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
/// wxVariant result = X->CallMethod("LoadMovie", args);\endcode
/// \par events
/// respond to events with the
/// \c EVT_ACTIVEX(controlId, eventName, handler) &
/// \c EVT_ACTIVEX_DISPID(controlId, eventDispId, handler) macros
/// \code
/// BEGIN_EVENT_TABLE(wxIEFrame, wxFrame)
/// EVT_ACTIVEX_DISPID(ID_MSHTML, DISPID_STATUSTEXTCHANGE, OnMSHTMLStatusTextChangeX)
/// EVT_ACTIVEX(ID_MSHTML, "BeforeNavigate2", OnMSHTMLBeforeNavigate2X)
/// EVT_ACTIVEX(ID_MSHTML, "TitleChange", OnMSHTMLTitleChangeX)
/// EVT_ACTIVEX(ID_MSHTML, "NewWindow2", OnMSHTMLNewWindow2X)
/// EVT_ACTIVEX(ID_MSHTML, "ProgressChange", OnMSHTMLProgressChangeX)
/// END_EVENT_TABLE()\endcode
class wxActiveX : public wxWindow {
public:
/// General parameter and return type infoformation for Events, Properties and Methods.
/// refer to ELEMDESC, IDLDESC in MSDN
class ParamX
{
public:
USHORT flags;
bool isPtr;
bool isSafeArray;
bool isOptional;
VARTYPE vt;
wxString name;
ParamX() : isOptional(false), vt(VT_EMPTY) {}
inline bool IsIn() const {return (flags & IDLFLAG_FIN) != 0;}
inline bool IsOut() const {return (flags & IDLFLAG_FOUT) != 0;}
inline bool IsRetVal() const {return (flags & IDLFLAG_FRETVAL) != 0;}
};
typedef vector<ParamX> ParamXArray;
/// Type & Parameter info for Events and Methods.
/// refer to FUNCDESC in MSDN
class FuncX
{
public:
wxString name;
MEMBERID memid;
bool hasOut;
ParamX retType;
ParamXArray params;
};
typedef vector<FuncX> FuncXArray;
/// Type info for properties.
class PropX
{
public:
wxString name;
MEMBERID memid;
ParamX type;
ParamX arg;
bool putByRef;
PropX() : putByRef (false) {}
inline bool CanGet() const {return type.vt != VT_EMPTY;}
inline bool CanSet() const {return arg.vt != VT_EMPTY;}
};
typedef vector<PropX> PropXArray;
/// Create using clsid.
wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxPanelNameStr);
/// create using progid.
wxActiveX(wxWindow * parent, const wxString& progId, wxWindowID id = -1,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxPanelNameStr);
virtual ~wxActiveX();
/// Number of events defined for this control.
inline int GetEventCount() const {return m_events.size();}
/// returns event description by index.
/// throws exception for invalid index
const FuncX& GetEventDesc(int idx) const;
/// Number of properties defined for this control.
inline int GetPropCount() const {return m_props.size();}
/// returns property description by index.
/// throws exception for invalid index
const PropX& GetPropDesc(int idx) const;
/// returns property description by name.
/// throws exception for invalid name
const PropX& GetPropDesc(const wxString& name) const;
/// Number of methods defined for this control.
inline int GetMethodCount() const {return m_methods.size();}
/// returns method description by name.
/// throws exception for invalid index
const FuncX& GetMethodDesc(int idx) const;
/// returns method description by name.
/// throws exception for invalid name
const FuncX& GetMethodDesc(const wxString& name) const;
/// Set property VARIANTARG value by MEMBERID.
void SetProp(MEMBERID name, VARIANTARG& value);
/// Set property using wxVariant by name.
void SetProp(const wxString &name, const wxVariant &value);
class wxPropertySetter
{
public:
wxActiveX *m_ctl;
wxString m_propName;
wxPropertySetter(wxActiveX *ctl, const wxString& propName) :
m_ctl(ctl), m_propName(propName) {}
inline const wxPropertySetter& operator = (wxVariant v) const
{
m_ctl->SetProp(m_propName, v);
return *this;
};
inline operator wxVariant() const {return m_ctl->GetPropAsWxVariant(m_propName);};
inline operator wxString() const {return m_ctl->GetPropAsString(m_propName);};
inline operator char() const {return m_ctl->GetPropAsChar(m_propName);};
inline operator long() const {return m_ctl->GetPropAsLong(m_propName);};
inline operator bool() const {return m_ctl->GetPropAsBool(m_propName);};
inline operator double() const {return m_ctl->GetPropAsDouble(m_propName);};
inline operator wxDateTime() const {return m_ctl->GetPropAsDateTime(m_propName);};
inline operator void *() const {return m_ctl->GetPropAsPointer(m_propName);};
};
/// \fn inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
/// \param name Property name to read/set
/// \return wxPropertySetter, which has overloads for setting/getting the property
/// \brief Generic Get/Set Property by name.
/// Automatically handles most types
/// \par Usage:
/// - Prop("\<name\>") = \<value\>
/// - var = Prop("\<name\>")
/// - e.g:
/// - \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
/// - \code flash_ctl.Prop("Playing") = false;\endcode
/// - \code wxString current_movie = flash_ctl.Prop("movie");\endcode
/// \exception raises exception if \<name\> is invalid
/// \note Have to add a few more type conversions yet ...
inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
VARIANT GetPropAsVariant(MEMBERID name);
VARIANT GetPropAsVariant(const wxString& name);
wxVariant GetPropAsWxVariant(const wxString& name);
wxString GetPropAsString(const wxString& name);
char GetPropAsChar(const wxString& name);
long GetPropAsLong(const wxString& name);
bool GetPropAsBool(const wxString& name);
double GetPropAsDouble(const wxString& name);
wxDateTime GetPropAsDateTime(const wxString& name);
void *GetPropAsPointer(const wxString& name);
// methods
// VARIANTARG form is passed straight to Invoke,
// so args in *REVERSE* order
VARIANT CallMethod(MEMBERID name, VARIANTARG args[], int argc);
VARIANT CallMethod(const wxString& name, VARIANTARG args[] = NULL, int argc = -1);
// args are in *NORMAL* order
// args can be a single wxVariant or an array
/// \fn wxVariant CallMethod(wxString name, wxVariant args[], int nargs = -1);
/// \param name name of method to call
/// \param args array of wxVariant's, defaults to NULL (no args)
/// \param nargs number of arguments passed via args. Defaults to actual number of args for the method
/// \return wxVariant
/// \brief Call a method of the ActiveX control.
/// Automatically handles most types
/// \par Usage:
/// - result = CallMethod("\<name\>", args, nargs)
/// - e.g.
/// - \code
/// wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
/// wxVariant result = X->CallMethod("LoadMovie", args);\endcode
/// \exception raises exception if \<name\> is invalid
/// \note Since wxVariant has built in type conversion, most the std types can be passed easily
wxVariant CallMethod(const wxString& name, wxVariant args[], int nargs = -1);
HRESULT ConnectAdvise(REFIID riid, IUnknown *eventSink);
void OnSize(wxSizeEvent&);
void OnPaint(wxPaintEvent& event);
void OnMouse(wxMouseEvent& event);
void OnSetFocus(wxFocusEvent&);
void OnKillFocus(wxFocusEvent&);
DECLARE_EVENT_TABLE();
protected:
friend class FrameSite;
friend class wxActiveXEvents;
unsigned long m_pdwRegister;
typedef map<MEMBERID, int> MemberIdMap;
typedef map<wxString, int, NS_wxActiveX::less_wxStringI> NameMap;
typedef wxAutoOleInterface<IConnectionPoint> wxOleConnectionPoint;
typedef pair<wxOleConnectionPoint, DWORD> wxOleConnection;
typedef vector<wxOleConnection> wxOleConnectionArray;
wxAutoOleInterface<IDispatch> m_Dispatch;
wxAutoOleInterface<IOleClientSite> m_clientSite;
wxAutoOleInterface<IUnknown> m_ActiveX;
wxAutoOleInterface<IOleObject> m_oleObject;
wxAutoOleInterface<IOleInPlaceObject> m_oleInPlaceObject;
wxAutoOleInterface<IOleInPlaceActiveObject>
m_oleInPlaceActiveObject;
wxAutoOleInterface<IOleDocumentView> m_docView;
wxAutoOleInterface<IViewObject> m_viewObject;
HWND m_oleObjectHWND;
bool m_bAmbientUserMode;
DWORD m_docAdviseCookie;
wxOleConnectionArray m_connections;
void CreateActiveX(REFCLSID clsid);
void CreateActiveX(LPOLESTR progId);
HRESULT AmbientPropertyChanged(DISPID dispid);
void GetTypeInfo();
void GetTypeInfo(ITypeInfo *ti, bool defInterface, bool defEventSink);
// events
FuncXArray m_events;
MemberIdMap m_eventMemberIds;
// properties
PropXArray m_props;
NameMap m_propNames;
// Methods
FuncXArray m_methods;
NameMap m_methodNames;
virtual bool MSWTranslateMessage(WXMSG* pMsg);
long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
DECLARE_CLASS(wxActiveX)
};
// events
class wxActiveXEvent : public wxCommandEvent
{
private:
friend class wxActiveXEvents;
wxVariant m_params;
public:
virtual wxEvent *Clone() const { return new wxActiveXEvent(*this); }
wxString EventName();
int ParamCount() const;
wxString ParamType(int idx);
wxString ParamName(int idx);
wxVariant& operator[] (int idx);
wxVariant& operator[] (wxString name);
private:
DECLARE_CLASS(wxActiveXEvent)
};
const wxEventType& RegisterActiveXEvent(const wxChar *eventName);
const wxEventType& RegisterActiveXEvent(DISPID event);
typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&);
/// \def EVT_ACTIVEX(id, eventName, fn)
/// \brief Event handle for events by name
#define EVT_ACTIVEX(id, eventName, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(wxT(eventName)), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
/// \def EVT_ACTIVEX_DISPID(id, eventDispId, fn)
/// \brief Event handle for events by DISPID (dispath id)
#define EVT_ACTIVEX_DISPID(id, eventDispId, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(eventDispId), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
//util
bool wxDateTimeToVariant(wxDateTime dt, VARIANTARG& va);
bool VariantToWxDateTime(VARIANTARG va, wxDateTime& dt);
/// \relates wxActiveX
/// \fn bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
/// \param va VARAIANTARG to convert from
/// \param vx Destination wxVariant
/// \return success/failure (true/false)
/// \brief Convert MSW VARIANTARG to wxVariant.
/// Handles basic types, need to add:
/// - VT_ARRAY | VT_*
/// - better support for VT_UNKNOWN (currently treated as void *)
/// - better support for VT_DISPATCH (currently treated as void *)
bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
/// \relates wxActiveX
/// \fn bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
/// \param vx wxVariant to convert from
/// \param va Destination VARIANTARG
/// \return success/failure (true/false)
/// \brief Convert wxVariant to MSW VARIANTARG.
/// Handles basic types, need to add:
/// - VT_ARRAY | VT_*
/// - better support for VT_UNKNOWN (currently treated as void *)
/// - better support for VT_DISPATCH (currently treated as void *)
bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
#endif /* _IEHTMLWIN_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -