📄 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;
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -