X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0dabb2a2c6ae27df135da4752b00579346bb74fc..8ec09aacc6d8a0ef8c8e3910c46258bc20f0734b:/wxPython/contrib/activex/wxie/wxactivex.cpp?ds=sidebyside diff --git a/wxPython/contrib/activex/wxie/wxactivex.cpp b/wxPython/contrib/activex/wxie/wxactivex.cpp index 7738d6ff57..77d372d993 100644 --- a/wxPython/contrib/activex/wxie/wxactivex.cpp +++ b/wxPython/contrib/activex/wxie/wxactivex.cpp @@ -85,6 +85,8 @@ BEGIN_EVENT_TABLE(wxActiveX, wxWindow) EVT_KILL_FOCUS(wxActiveX::OnKillFocus) END_EVENT_TABLE() +IMPLEMENT_CLASS(wxActiveX, wxWindow) + class wxActiveX; class FrameSite : @@ -296,12 +298,13 @@ wxActiveX::~wxActiveX() m_oleObject->Close(OLECLOSE_NOSAVE); m_oleObject->SetClientSite(NULL); } + + // Unregister object as active + RevokeActiveObject(m_pdwRegister, NULL); } void wxActiveX::CreateActiveX(REFCLSID clsid) { - SetTransparent(); - HRESULT hret; //////////////////////////////////////////////////////// @@ -315,10 +318,15 @@ void wxActiveX::CreateActiveX(REFCLSID clsid) wxCHECK_RET(adviseSink.Ok(), _T("adviseSink not Ok")); - // // Create Object, get IUnknown interface + // Create Object, get IUnknown interface m_ActiveX.CreateInstance(clsid, IID_IUnknown); wxCHECK_RET(m_ActiveX.Ok(), _T("m_ActiveX.CreateInstance failed")); + // Register object as active + unsigned long pdwRegister; + hret = RegisterActiveObject(m_ActiveX, clsid, ACTIVEOBJECT_WEAK, &m_pdwRegister); + WXOLE_WARN(hret, "Unable to register object as active"); + // Get Dispatch interface hret = m_Dispatch.QueryInterface(IID_IDispatch, m_ActiveX); WXOLE_WARN(hret, "Unable to get dispatch interface"); @@ -413,7 +421,7 @@ void wxActiveX::CreateActiveX(REFCLSID clsid) // Update by GBR to resize older controls wxSizeEvent szEvent; szEvent.m_size = wxSize(w, h) ; - AddPendingEvent(szEvent); + GetEventHandler()->AddPendingEvent(szEvent); }; } @@ -891,7 +899,7 @@ public: { // cdecl call // sometimes the pDispParams does not match the param info for a activex control - int nArg = min(func.params.size(), pDispParams->cArgs); + int nArg = wxMin(func.params.size(), pDispParams->cArgs); for (int i = nArg - 1; i >= 0; i--) { VARIANTARG& va = pDispParams->rgvarg[i]; @@ -906,8 +914,8 @@ public: if (func.hasOut) { - int nArg = min(func.params.size(), pDispParams->cArgs); - m_activeX->GetParent()->ProcessEvent(event); + int nArg = wxMin(func.params.size(), pDispParams->cArgs); + m_activeX->GetEventHandler()->ProcessEvent(event); for (int i = 0; i < nArg; i++) { VARIANTARG& va = pDispParams->rgvarg[i]; @@ -922,7 +930,7 @@ public: }; } else - m_activeX->GetParent()->AddPendingEvent(event); + m_activeX->GetEventHandler()->AddPendingEvent(event); }; @@ -1162,9 +1170,35 @@ void wxActiveX::GetTypeInfo(ITypeInfo *ti, bool defInterface, bool defEventSink) ConnectAdvise(ta->guid, disp); }; + // Get properties + // See bug #1280715 in the wxActiveX SF project + int i; + for (i = 0; i < ta->cVars; i++) { + VARDESC FAR *vd = NULL; + + typeInfo->GetVarDesc(i, &vd) ; + BSTR bstrProperty = NULL; + typeInfo->GetDocumentation(vd->memid, &bstrProperty, + NULL, NULL, NULL); + wxString propName(bstrProperty); + m_props.push_back(PropX()); + int idx = m_props.size() - 1; + m_propNames[propName] = idx; + m_props[idx].name = propName; + m_props[idx].memid = vd->memid; + + ParamX param; + param.isSafeArray = false; + param.isPtr = false; + param.flags = vd->elemdescVar.idldesc.wIDLFlags; + param.vt = vd->elemdescVar.tdesc.vt; + + m_props[idx].arg = param; + m_props[idx].type = param; + } // Get Function Names - for (int i = 0; i < ta->cFuncs; i++) + for (i = 0; i < ta->cFuncs; i++) { FUNCDESC FAR *fd = NULL; @@ -1672,7 +1706,6 @@ void wxActiveX::OnPaint(wxPaintEvent& event) { wxLogTrace(wxT(""),wxT("repainting activex win")); wxPaintDC dc(this); - dc.BeginDrawing(); int w, h; GetSize(&w, &h); RECT posRect; @@ -1697,7 +1730,6 @@ void wxActiveX::OnPaint(wxPaintEvent& event) dc.DrawRectangle(0, 0, w, h); dc.SetBrush(wxNullBrush); } - dc.EndDrawing(); } @@ -1767,6 +1799,16 @@ void wxActiveX::OnMouse(wxMouseEvent& event) wxLogTrace(wxT(""),wxT("msg sent")); } +bool wxActiveX::MSWTranslateMessage(WXMSG *msg){ + + if (msg->message == WM_KEYDOWN){ + HRESULT result = m_oleInPlaceActiveObject->TranslateAccelerator(msg); + return (result == S_OK); + } + + return wxWindow::MSWTranslateMessage(msg); +} + long wxActiveX::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { if (m_oleObjectHWND == NULL)