📄 activex.cpp
字号:
{ (*ppFrame)->Release(); *ppFrame = NULL; return E_UNEXPECTED; } RECT rect; ::GetClientRect(m_hWndParent, &rect); if (lprcPosRect) { lprcPosRect->left = lprcPosRect->top = 0; lprcPosRect->right = rect.right; lprcPosRect->bottom = rect.bottom; } if (lprcClipRect) { lprcClipRect->left = lprcClipRect->top = 0; lprcClipRect->right = rect.right; lprcClipRect->bottom = rect.bottom; } memset(lpFrameInfo, 0, sizeof(OLEINPLACEFRAMEINFO)); lpFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO); lpFrameInfo->hwndFrame = m_hWndParent; return S_OK; } HRESULT STDMETHODCALLTYPE Scroll(SIZE){return S_OK;} HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL) { m_bUIActive = false; return S_OK; } HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate() { m_bInPlaceActive = false; return S_OK; } HRESULT STDMETHODCALLTYPE DiscardUndoState(){return S_OK;} HRESULT STDMETHODCALLTYPE DeactivateAndUndo(){return S_OK; } HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT lprcPosRect) { if (m_window->m_oleInPlaceObject.Ok() && lprcPosRect) { // // Result of several hours and days of bug hunting - // this is called by an object when it wants to resize // itself to something different then our parent window - // don't let it :) //// m_window->m_oleInPlaceObject->SetObjectRects(// lprcPosRect, lprcPosRect); RECT rcClient; ::GetClientRect(m_hWndParent, &rcClient); m_window->m_oleInPlaceObject->SetObjectRects( &rcClient, &rcClient); } return S_OK; } //*************************IOleInPlaceSiteEx*********************** HRESULT STDMETHODCALLTYPE OnInPlaceActivateEx(BOOL * pfNoRedraw, DWORD) {#ifdef __WXWINCE__ IRunnableObject* runnable = NULL; HRESULT hr = QueryInterface( IID_IRunnableObject, (void**)(& runnable)); if (SUCCEEDED(hr)) { runnable->LockRunning(TRUE, FALSE); }#else OleLockRunning(m_window->m_ActiveX, TRUE, FALSE);#endif if (pfNoRedraw) (*pfNoRedraw) = FALSE; return S_OK; } HRESULT STDMETHODCALLTYPE OnInPlaceDeactivateEx(BOOL) {#ifdef __WXWINCE__ IRunnableObject* runnable = NULL; HRESULT hr = QueryInterface( IID_IRunnableObject, (void**)(& runnable)); if (SUCCEEDED(hr)) { runnable->LockRunning(FALSE, FALSE); }#else OleLockRunning(m_window->m_ActiveX, FALSE, FALSE);#endif return S_OK; } STDMETHOD(RequestUIActivate)(){ return S_OK;} //*************************IOleClientSite************************** HRESULT STDMETHODCALLTYPE SaveObject(){return S_OK;} const char *OleGetMonikerToStr(DWORD dwAssign) { switch (dwAssign) { case OLEGETMONIKER_ONLYIFTHERE : return "OLEGETMONIKER_ONLYIFTHERE"; case OLEGETMONIKER_FORCEASSIGN : return "OLEGETMONIKER_FORCEASSIGN"; case OLEGETMONIKER_UNASSIGN : return "OLEGETMONIKER_UNASSIGN"; case OLEGETMONIKER_TEMPFORUSER : return "OLEGETMONIKER_TEMPFORUSER"; default : return "Bad Enum"; } } const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker) { switch(dwWhichMoniker) { case OLEWHICHMK_CONTAINER : return "OLEWHICHMK_CONTAINER"; case OLEWHICHMK_OBJREL : return "OLEWHICHMK_OBJREL"; case OLEWHICHMK_OBJFULL : return "OLEWHICHMK_OBJFULL"; default : return "Bad Enum"; } } STDMETHOD(GetMoniker)(DWORD, DWORD, IMoniker **){return E_FAIL;} HRESULT STDMETHODCALLTYPE GetContainer(LPOLECONTAINER * ppContainer) { if (ppContainer == NULL) return E_INVALIDARG; HRESULT hr = QueryInterface( IID_IOleContainer, (void**)(ppContainer)); wxASSERT(SUCCEEDED(hr)); return hr; } HRESULT STDMETHODCALLTYPE ShowObject() { if (m_window->m_oleObjectHWND) ::ShowWindow(m_window->m_oleObjectHWND, SW_SHOW); return S_OK; } STDMETHOD(OnShowWindow)(BOOL){return S_OK;} STDMETHOD(RequestNewObjectLayout)(){return E_NOTIMPL;} //********************IParseDisplayName*************************** HRESULT STDMETHODCALLTYPE ParseDisplayName( IBindCtx *, LPOLESTR, ULONG *, IMoniker **){return E_NOTIMPL;} //********************IOleContainer******************************* STDMETHOD(EnumObjects)(DWORD, IEnumUnknown **){return E_NOTIMPL;} HRESULT STDMETHODCALLTYPE LockContainer(BOOL){return S_OK;} //********************IOleItemContainer*************************** HRESULT STDMETHODCALLTYPE #if 0 // defined(__WXWINCE__) && __VISUALC__ < 1400 GetObject #elif defined(_UNICODE) GetObjectW #else GetObjectA #endif (LPOLESTR pszItem, DWORD, IBindCtx *, REFIID, void ** ppvObject) { if (pszItem == NULL || ppvObject == NULL) return E_INVALIDARG; *ppvObject = NULL; return MK_E_NOOBJECT; } HRESULT STDMETHODCALLTYPE GetObjectStorage( LPOLESTR pszItem, IBindCtx * , REFIID, void ** ppvStorage) { if (pszItem == NULL || ppvStorage == NULL) return E_INVALIDARG; *ppvStorage = NULL; return MK_E_NOOBJECT; } HRESULT STDMETHODCALLTYPE IsRunning(LPOLESTR pszItem) { if (pszItem == NULL) return E_INVALIDARG; return MK_E_NOOBJECT; } //***********************IOleControlSite***************************** HRESULT STDMETHODCALLTYPE OnControlInfoChanged() {return S_OK;} HRESULT STDMETHODCALLTYPE LockInPlaceActive(BOOL fLock) { m_bInPlaceLocked = (fLock) ? true : false; return S_OK; } HRESULT STDMETHODCALLTYPE GetExtendedControl(IDispatch **) {return E_NOTIMPL;} HRESULT STDMETHODCALLTYPE TransformCoords( POINTL * pPtlHimetric, POINTF * pPtfContainer, DWORD) { if (pPtlHimetric == NULL || pPtfContainer == NULL) return E_INVALIDARG; return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG, DWORD) {return E_NOTIMPL;} HRESULT STDMETHODCALLTYPE OnFocus(BOOL){return S_OK;} HRESULT STDMETHODCALLTYPE ShowPropertyFrame(){return E_NOTIMPL;} //**************************IOleCommandTarget*********************** HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *) { if (prgCmds == NULL) return E_INVALIDARG; for (ULONG nCmd = 0; nCmd < cCmds; nCmd++) { // unsupported by default prgCmds[nCmd].cmdf = 0; } return OLECMDERR_E_UNKNOWNGROUP; } HRESULT STDMETHODCALLTYPE Exec(const GUID *, DWORD, DWORD, VARIANTARG *, VARIANTARG *) {return OLECMDERR_E_NOTSUPPORTED;} //**********************IAdviseSink************************************ void STDMETHODCALLTYPE OnDataChange(FORMATETC *, STGMEDIUM *) {} void STDMETHODCALLTYPE OnViewChange(DWORD, LONG) {} void STDMETHODCALLTYPE OnRename(IMoniker *){} void STDMETHODCALLTYPE OnSave(){} void STDMETHODCALLTYPE OnClose(){} //**********************IOleDocumentSite*************************** HRESULT STDMETHODCALLTYPE ActivateMe( IOleDocumentView __RPC_FAR *pViewToActivate) { wxAutoIOleInPlaceSite inPlaceSite( IID_IOleInPlaceSite, (IDispatch *) this); if (!inPlaceSite.Ok()) return E_FAIL; if (pViewToActivate) { m_window->m_docView = pViewToActivate; m_window->m_docView->SetInPlaceSite(inPlaceSite); } else { wxAutoIOleDocument oleDoc( IID_IOleDocument, m_window->m_oleObject); if (! oleDoc.Ok()) return E_FAIL; HRESULT hr = oleDoc->CreateView(inPlaceSite, NULL, 0, m_window->m_docView.GetRef()); if (hr != S_OK) return E_FAIL; m_window->m_docView->SetInPlaceSite(inPlaceSite); } m_window->m_docView->UIActivate(TRUE); return S_OK; }protected: wxActiveXContainer * m_window; HDC m_hDCBuffer; HWND m_hWndParent; bool m_bSupportsWindowlessActivation; bool m_bInPlaceLocked; bool m_bInPlaceActive; bool m_bUIActive; bool m_bWindowless; LCID m_nAmbientLocale; COLORREF m_clrAmbientForeColor; COLORREF m_clrAmbientBackColor; bool m_bAmbientShowHatching; bool m_bAmbientShowGrabHandles; bool m_bAmbientAppearance;};DEFINE_OLE_TABLE(FrameSite) OLE_INTERFACE(IID_IUnknown, IOleClientSite) OLE_IINTERFACE(IOleClientSite) OLE_INTERFACE(IID_IOleWindow, IOleInPlaceSite) OLE_IINTERFACE(IOleInPlaceSite) OLE_IINTERFACE(IOleInPlaceSiteEx) OLE_IINTERFACE(IOleInPlaceUIWindow) OLE_IINTERFACE(IOleInPlaceFrame) OLE_IINTERFACE(IParseDisplayName) OLE_IINTERFACE(IOleContainer) OLE_IINTERFACE(IOleItemContainer) OLE_IINTERFACE(IDispatch) OLE_IINTERFACE(IOleCommandTarget) OLE_IINTERFACE(IOleDocumentSite) OLE_IINTERFACE(IAdviseSink) OLE_IINTERFACE(IOleControlSite)END_OLE_TABLE//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//// wxActiveXEvents//// Handles and sends activex events received from the ActiveX control// to the appropriate wxEvtHandler////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++class wxActiveXEvents : public IDispatch{private: DECLARE_OLE_UNKNOWN(wxActiveXEvents); wxActiveXContainer *m_activeX; IID m_customId; bool m_haveCustomId; friend bool wxActiveXEventsInterface(wxActiveXEvents *self, REFIID iid, void **_interface, const char *&desc);public: wxActiveXEvents(wxActiveXContainer *ax) : m_activeX(ax), m_haveCustomId(false) {} wxActiveXEvents(wxActiveXContainer *ax, REFIID iid) : m_activeX(ax), m_customId(iid), m_haveCustomId(true) {} virtual ~wxActiveXEvents() { } // IDispatch STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR**, unsigned int, LCID, DISPID*) { return E_NOTIMPL; } STDMETHODIMP GetTypeInfo(unsigned int, LCID, ITypeInfo**) { return E_NOTIMPL; } STDMETHODIMP GetTypeInfoCount(unsigned int*) { return E_NOTIMPL; } STDMETHODIMP Invoke(DISPID dispIdMember, REFIID WXUNUSED(riid), LCID WXUNUSED(lcid), WORD wFlags, DISPPARAMS * pDispParams, VARIANT * WXUNUSED(pVarResult), EXCEPINFO * WXUNUSED(pExcepInfo), unsigned int * WXUNUSED(puArgErr)) { if (wFlags & (DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) return E_NOTIMPL; wxASSERT(m_activeX); // ActiveX Event // Dispatch Event wxActiveXEvent event; event.SetEventType(wxEVT_ACTIVEX); event.m_params.NullList(); event.m_dispid = dispIdMember; // arguments if (pDispParams) { for (DWORD i = pDispParams->cArgs; i > 0; i--) { VARIANTARG& va = pDispParams->rgvarg[i-1]; wxVariant vx;// vx.SetName(px.name); wxConvertOleToVariant(va, vx); event.m_params.Append(vx); } } // process the events from the activex method m_activeX->ProcessEvent(event); for (DWORD i = 0; i < pDispParams->cArgs; i++) { VARIANTARG& va = pDispParams->rgvarg[i]; wxVariant& vx = event.m_params[pDispParams->cArgs - i - 1]; wxConvertVariantToOle(vx, va); } if(event.GetSkipped()) return DISP_E_MEMBERNOTFOUND; return S_OK; }};bool wxActiveXEventsInterface(wxActiveXEvents *self, REFIID iid, void **_interface, const char *&desc){ if (self->m_haveCustomId && IsEqualIID(iid, self->m_customId)) {// WXOLE_TRACE("Found Custom Dispatch Interface"); *_interface = (IUnknown *) (IDispatch *) self; desc = "Custom Dispatch Interface"; return true; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -