1 /////////////////////////////////////////////////////////////////////////////
2 // Name: msw/ole/activex.cpp
3 // Purpose: wxActiveXContainer implementation
4 // Author: Ryan Norton <wxprojects@comcast.net>, Lindsay Mathieson <???>
8 // Copyright: (c) 2003 Lindsay Mathieson, (c) 2005 Ryan Norton
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 //===========================================================================
14 //===========================================================================
16 //---------------------------------------------------------------------------
18 //---------------------------------------------------------------------------
19 #include "wx/wxprec.h"
21 #include "wx/msw/ole/activex.h"
26 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
32 #define DECLARE_OLE_UNKNOWN(cls)\
38 TAutoInitInt() : l(0) {}\
40 TAutoInitInt refCount, lockCount;\
41 static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
44 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);\
45 ULONG STDMETHODCALLTYPE AddRef();\
46 ULONG STDMETHODCALLTYPE Release();\
47 ULONG STDMETHODCALLTYPE AddLock();\
48 ULONG STDMETHODCALLTYPE ReleaseLock()
50 #define DEFINE_OLE_TABLE(cls)\
51 LONG cls::GetRefCount() {return refCount.l;}\
52 HRESULT STDMETHODCALLTYPE cls::QueryInterface(REFIID iid, void ** ppvObject)\
58 const char *desc = NULL;\
59 cls::_GetInterface(this, iid, ppvObject, desc);\
62 return E_NOINTERFACE;\
64 ((IUnknown * )(*ppvObject))->AddRef();\
67 ULONG STDMETHODCALLTYPE cls::AddRef()\
69 InterlockedIncrement(&refCount.l);\
72 ULONG STDMETHODCALLTYPE cls::Release()\
76 InterlockedDecrement(&refCount.l);\
87 ULONG STDMETHODCALLTYPE cls::AddLock()\
89 InterlockedIncrement(&lockCount.l);\
92 ULONG STDMETHODCALLTYPE cls::ReleaseLock()\
96 InterlockedDecrement(&lockCount.l);\
104 #define DEFINE_OLE_BASE(cls)\
105 void cls::_GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc)\
110 #define OLE_INTERFACE(_iid, _type)\
111 if (IsEqualIID(iid, _iid))\
113 *_interface = (IUnknown *) (_type *) self;\
118 #define OLE_IINTERFACE(_face) OLE_INTERFACE(IID_##_face, _face)
120 #define OLE_INTERFACE_CUSTOM(func)\
121 if (func(self, iid, _interface, desc))\
126 #define END_OLE_TABLE\
131 public IOleClientSite
,
132 public IOleInPlaceSiteEx
,
133 public IOleInPlaceFrame
,
134 public IOleItemContainer
,
136 public IOleCommandTarget
,
137 public IOleDocumentSite
,
139 public IOleControlSite
142 DECLARE_OLE_UNKNOWN(FrameSite
);
145 FrameSite(wxWindow
* win
, wxActiveXContainer
* win2
)
148 m_bSupportsWindowlessActivation
= true;
149 m_bInPlaceLocked
= false;
151 m_bInPlaceActive
= false;
152 m_bWindowless
= false;
154 m_nAmbientLocale
= 0;
155 m_clrAmbientForeColor
= ::GetSysColor(COLOR_WINDOWTEXT
);
156 m_clrAmbientBackColor
= ::GetSysColor(COLOR_WINDOW
);
157 m_bAmbientShowHatching
= true;
158 m_bAmbientShowGrabHandles
= true;
159 m_bAmbientAppearance
= true;
162 m_hWndParent
= (HWND
)win
->GetHWND();
164 virtual ~FrameSite(){}
165 //***************************IDispatch*****************************
166 HRESULT STDMETHODCALLTYPE
GetIDsOfNames(REFIID
, OLECHAR
** ,
167 unsigned int , LCID
,
169 { return E_NOTIMPL
; }
170 STDMETHOD(GetTypeInfo
)(unsigned int, LCID
, ITypeInfo
**)
171 { return E_NOTIMPL
; }
172 HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(unsigned int *)
173 { return E_NOTIMPL
; }
174 HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID
, LCID
,
175 WORD wFlags
, DISPPARAMS
*,
176 VARIANT
* pVarResult
, EXCEPINFO
*,
179 if (!(wFlags
& DISPATCH_PROPERTYGET
))
182 if (pVarResult
== NULL
)
185 //The most common case is boolean, use as an initial type
186 V_VT(pVarResult
) = VT_BOOL
;
188 switch (dispIdMember
)
190 case DISPID_AMBIENT_MESSAGEREFLECT
:
191 V_BOOL(pVarResult
)= FALSE
;
194 case DISPID_AMBIENT_DISPLAYASDEFAULT
:
195 V_BOOL(pVarResult
)= TRUE
;
198 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
199 V_BOOL(pVarResult
) = TRUE
;
202 case DISPID_AMBIENT_SILENT
:
203 V_BOOL(pVarResult
)= TRUE
;
206 case DISPID_AMBIENT_APPEARANCE
:
207 pVarResult
->vt
= VT_BOOL
;
208 pVarResult
->boolVal
= m_bAmbientAppearance
;
211 case DISPID_AMBIENT_FORECOLOR
:
212 pVarResult
->vt
= VT_I4
;
213 pVarResult
->lVal
= (long) m_clrAmbientForeColor
;
216 case DISPID_AMBIENT_BACKCOLOR
:
217 pVarResult
->vt
= VT_I4
;
218 pVarResult
->lVal
= (long) m_clrAmbientBackColor
;
221 case DISPID_AMBIENT_LOCALEID
:
222 pVarResult
->vt
= VT_I4
;
223 pVarResult
->lVal
= (long) m_nAmbientLocale
;
226 case DISPID_AMBIENT_USERMODE
:
227 pVarResult
->vt
= VT_BOOL
;
228 pVarResult
->boolVal
= m_window
->m_bAmbientUserMode
;
231 case DISPID_AMBIENT_SHOWGRABHANDLES
:
232 pVarResult
->vt
= VT_BOOL
;
233 pVarResult
->boolVal
= m_bAmbientShowGrabHandles
;
236 case DISPID_AMBIENT_SHOWHATCHING
:
237 pVarResult
->vt
= VT_BOOL
;
238 pVarResult
->boolVal
= m_bAmbientShowHatching
;
242 return DISP_E_MEMBERNOTFOUND
;
248 //**************************IOleWindow***************************
249 HRESULT STDMETHODCALLTYPE
GetWindow(HWND
* phwnd
)
253 (*phwnd
) = m_hWndParent
;
256 HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL
)
258 //**************************IOleInPlaceUIWindow*****************
259 HRESULT STDMETHODCALLTYPE
GetBorder(LPRECT lprectBorder
)
261 if (lprectBorder
== NULL
)
263 return INPLACE_E_NOTOOLSPACE
;
265 HRESULT STDMETHODCALLTYPE
RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
)
267 if (pborderwidths
== NULL
)
269 return INPLACE_E_NOTOOLSPACE
;
271 HRESULT STDMETHODCALLTYPE
SetBorderSpace(LPCBORDERWIDTHS
)
273 HRESULT STDMETHODCALLTYPE
SetActiveObject(
274 IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR
)
277 pActiveObject
->AddRef();
279 m_window
->m_oleInPlaceActiveObject
= pActiveObject
;
283 //********************IOleInPlaceFrame************************
285 STDMETHOD(InsertMenus
)(HMENU
, LPOLEMENUGROUPWIDTHS
){return S_OK
;}
286 STDMETHOD(SetMenu
)(HMENU
, HOLEMENU
, HWND
){ return S_OK
;}
287 STDMETHOD(RemoveMenus
)(HMENU
){return S_OK
;}
288 STDMETHOD(SetStatusText
)(LPCOLESTR
){ return S_OK
;}
289 HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL
){return S_OK
;}
290 HRESULT STDMETHODCALLTYPE
TranslateAccelerator(LPMSG lpmsg
, WORD
)
292 // TODO: send an event with this id
293 if (m_window
->m_oleInPlaceActiveObject
.Ok())
294 m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
);
298 //*******************IOleInPlaceSite**************************
299 HRESULT STDMETHODCALLTYPE
CanInPlaceActivate(){return S_OK
;}
300 HRESULT STDMETHODCALLTYPE
OnInPlaceActivate()
301 { m_bInPlaceActive
= true; return S_OK
; }
302 HRESULT STDMETHODCALLTYPE
OnUIActivate()
303 { m_bUIActive
= true; return S_OK
; }
304 HRESULT STDMETHODCALLTYPE
GetWindowContext(IOleInPlaceFrame
**ppFrame
,
305 IOleInPlaceUIWindow
**ppDoc
,
308 LPOLEINPLACEFRAMEINFO lpFrameInfo
)
310 if (ppFrame
== NULL
|| ppDoc
== NULL
|| lprcPosRect
== NULL
||
311 lprcClipRect
== NULL
|| lpFrameInfo
== NULL
)
320 HRESULT hr
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
);
326 hr
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
);
329 (*ppFrame
)->Release();
335 ::GetClientRect(m_hWndParent
, &rect
);
338 lprcPosRect
->left
= lprcPosRect
->top
= 0;
339 lprcPosRect
->right
= rect
.right
;
340 lprcPosRect
->bottom
= rect
.bottom
;
344 lprcClipRect
->left
= lprcClipRect
->top
= 0;
345 lprcClipRect
->right
= rect
.right
;
346 lprcClipRect
->bottom
= rect
.bottom
;
349 memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
));
350 lpFrameInfo
->cb
= sizeof(OLEINPLACEFRAMEINFO
);
351 lpFrameInfo
->hwndFrame
= m_hWndParent
;
355 HRESULT STDMETHODCALLTYPE
Scroll(SIZE
){return S_OK
;}
356 HRESULT STDMETHODCALLTYPE
OnUIDeactivate(BOOL
)
357 { m_bUIActive
= false; return S_OK
; }
358 HRESULT STDMETHODCALLTYPE
OnInPlaceDeactivate()
359 { m_bInPlaceActive
= false; return S_OK
; }
360 HRESULT STDMETHODCALLTYPE
DiscardUndoState(){return S_OK
;}
361 HRESULT STDMETHODCALLTYPE
DeactivateAndUndo(){return S_OK
; }
362 HRESULT STDMETHODCALLTYPE
OnPosRectChange(LPCRECT lprcPosRect
)
364 if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
)
366 m_window
->m_oleInPlaceObject
->SetObjectRects(
367 lprcPosRect
, lprcPosRect
);
371 //*************************IOleInPlaceSiteEx***********************
372 HRESULT STDMETHODCALLTYPE
OnInPlaceActivateEx(BOOL
* pfNoRedraw
, DWORD
)
374 OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
);
376 (*pfNoRedraw
) = FALSE
;
380 HRESULT STDMETHODCALLTYPE
OnInPlaceDeactivateEx(BOOL
)
382 OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
);
385 STDMETHOD(RequestUIActivate
)(){ return S_OK
;}
386 //*************************IOleClientSite**************************
387 HRESULT STDMETHODCALLTYPE
SaveObject(){return S_OK
;}
388 const char *OleGetMonikerToStr(DWORD dwAssign
)
392 case OLEGETMONIKER_ONLYIFTHERE
: return "OLEGETMONIKER_ONLYIFTHERE";
393 case OLEGETMONIKER_FORCEASSIGN
: return "OLEGETMONIKER_FORCEASSIGN";
394 case OLEGETMONIKER_UNASSIGN
: return "OLEGETMONIKER_UNASSIGN";
395 case OLEGETMONIKER_TEMPFORUSER
: return "OLEGETMONIKER_TEMPFORUSER";
396 default : return "Bad Enum";
400 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
)
402 switch(dwWhichMoniker
)
404 case OLEWHICHMK_CONTAINER
: return "OLEWHICHMK_CONTAINER";
405 case OLEWHICHMK_OBJREL
: return "OLEWHICHMK_OBJREL";
406 case OLEWHICHMK_OBJFULL
: return "OLEWHICHMK_OBJFULL";
407 default : return "Bad Enum";
410 STDMETHOD(GetMoniker
)(DWORD
, DWORD
, IMoniker
**){return E_FAIL
;}
411 HRESULT STDMETHODCALLTYPE
GetContainer(LPOLECONTAINER
* ppContainer
)
413 if (ppContainer
== NULL
)
415 HRESULT hr
= QueryInterface(
416 IID_IOleContainer
, (void**)(ppContainer
));
417 wxASSERT(SUCCEEDED(hr
));
420 HRESULT STDMETHODCALLTYPE
ShowObject()
422 if (m_window
->m_oleObjectHWND
)
423 ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
);
426 STDMETHOD(OnShowWindow
)(BOOL
){return S_OK
;}
427 STDMETHOD(RequestNewObjectLayout
)(){return E_NOTIMPL
;}
428 //********************IParseDisplayName***************************
429 HRESULT STDMETHODCALLTYPE
ParseDisplayName(
430 IBindCtx
*, LPOLESTR
, ULONG
*, IMoniker
**){return E_NOTIMPL
;}
431 //********************IOleContainer*******************************
432 STDMETHOD(EnumObjects
)(DWORD
, IEnumUnknown
**){return E_NOTIMPL
;}
433 HRESULT STDMETHODCALLTYPE
LockContainer(BOOL
){return S_OK
;}
434 //********************IOleItemContainer***************************
435 HRESULT STDMETHODCALLTYPE
441 (LPOLESTR pszItem
, DWORD
, IBindCtx
*, REFIID
, void ** ppvObject
)
443 if (pszItem
== NULL
|| ppvObject
== NULL
)
446 return MK_E_NOOBJECT
;
448 HRESULT STDMETHODCALLTYPE
GetObjectStorage(
449 LPOLESTR pszItem
, IBindCtx
* , REFIID
, void ** ppvStorage
)
451 if (pszItem
== NULL
|| ppvStorage
== NULL
)
454 return MK_E_NOOBJECT
;
456 HRESULT STDMETHODCALLTYPE
IsRunning(LPOLESTR pszItem
)
460 return MK_E_NOOBJECT
;
462 //***********************IOleControlSite*****************************
463 HRESULT STDMETHODCALLTYPE
OnControlInfoChanged()
465 HRESULT STDMETHODCALLTYPE
LockInPlaceActive(BOOL fLock
)
467 m_bInPlaceLocked
= (fLock
) ? true : false;
470 HRESULT STDMETHODCALLTYPE
GetExtendedControl(IDispatch
**)
472 HRESULT STDMETHODCALLTYPE
TransformCoords(
473 POINTL
* pPtlHimetric
, POINTF
* pPtfContainer
, DWORD
)
475 if (pPtlHimetric
== NULL
|| pPtfContainer
== NULL
)
479 HRESULT STDMETHODCALLTYPE
TranslateAccelerator(LPMSG
, DWORD
)
481 HRESULT STDMETHODCALLTYPE
OnFocus(BOOL
){return S_OK
;}
482 HRESULT STDMETHODCALLTYPE
ShowPropertyFrame(){return E_NOTIMPL
;}
483 //**************************IOleCommandTarget***********************
484 HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*, ULONG cCmds
,
485 OLECMD prgCmds
[], OLECMDTEXT
*)
487 if (prgCmds
== NULL
) return E_INVALIDARG
;
488 for (ULONG nCmd
= 0; nCmd
< cCmds
; nCmd
++)
490 // unsupported by default
491 prgCmds
[nCmd
].cmdf
= 0;
493 return OLECMDERR_E_UNKNOWNGROUP
;
496 HRESULT STDMETHODCALLTYPE
Exec(const GUID
*, DWORD
,
497 DWORD
, VARIANTARG
*, VARIANTARG
*)
498 {return OLECMDERR_E_NOTSUPPORTED
;}
500 //**********************IAdviseSink************************************
501 void STDMETHODCALLTYPE
OnDataChange(FORMATETC
*, STGMEDIUM
*) {}
502 void STDMETHODCALLTYPE
OnViewChange(DWORD
, LONG
) {}
503 void STDMETHODCALLTYPE
OnRename(IMoniker
*){}
504 void STDMETHODCALLTYPE
OnSave(){}
505 void STDMETHODCALLTYPE
OnClose(){}
507 //**********************IOleDocumentSite***************************
508 HRESULT STDMETHODCALLTYPE
ActivateMe(
509 IOleDocumentView __RPC_FAR
*pViewToActivate
)
511 wxAutoIOleInPlaceSite
inPlaceSite(
512 IID_IOleInPlaceSite
, (IDispatch
*) this);
513 if (!inPlaceSite
.Ok())
518 m_window
->m_docView
= pViewToActivate
;
519 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
523 wxAutoIOleDocument
oleDoc(
524 IID_IOleDocument
, m_window
->m_oleObject
);
528 HRESULT hr
= oleDoc
->CreateView(inPlaceSite
, NULL
,
529 0, m_window
->m_docView
.GetRef());
533 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
536 m_window
->m_docView
->UIActivate(TRUE
);
542 wxActiveXContainer
* m_window
;
547 bool m_bSupportsWindowlessActivation
;
548 bool m_bInPlaceLocked
;
549 bool m_bInPlaceActive
;
553 LCID m_nAmbientLocale
;
554 COLORREF m_clrAmbientForeColor
;
555 COLORREF m_clrAmbientBackColor
;
556 bool m_bAmbientShowHatching
;
557 bool m_bAmbientShowGrabHandles
;
558 bool m_bAmbientAppearance
;
561 DEFINE_OLE_TABLE(FrameSite
)
562 OLE_INTERFACE(IID_IUnknown
, IOleClientSite
)
563 OLE_IINTERFACE(IOleClientSite
)
564 OLE_INTERFACE(IID_IOleWindow
, IOleInPlaceSite
)
565 OLE_IINTERFACE(IOleInPlaceSite
)
566 OLE_IINTERFACE(IOleInPlaceSiteEx
)
567 OLE_IINTERFACE(IOleInPlaceUIWindow
)
568 OLE_IINTERFACE(IOleInPlaceFrame
)
569 OLE_IINTERFACE(IParseDisplayName
)
570 OLE_IINTERFACE(IOleContainer
)
571 OLE_IINTERFACE(IOleItemContainer
)
572 OLE_IINTERFACE(IDispatch
)
573 OLE_IINTERFACE(IOleCommandTarget
)
574 OLE_IINTERFACE(IOleDocumentSite
)
575 OLE_IINTERFACE(IAdviseSink
)
576 OLE_IINTERFACE(IOleControlSite
)
580 wxActiveXContainer::wxActiveXContainer(wxWindow
* parent
, REFIID iid
, IUnknown
* pUnk
)
581 : m_realparent(parent
)
583 m_bAmbientUserMode
= true;
584 m_docAdviseCookie
= 0;
585 CreateActiveX(iid
, pUnk
);
588 wxActiveXContainer::~wxActiveXContainer()
590 // disconnect connection points
591 if (m_oleInPlaceObject
.Ok())
593 m_oleInPlaceObject
->InPlaceDeactivate();
594 m_oleInPlaceObject
->UIDeactivate();
597 if (m_oleObject
.Ok())
599 if (m_docAdviseCookie
!= 0)
600 m_oleObject
->Unadvise(m_docAdviseCookie
);
603 OLEIVERB_HIDE
, NULL
, m_clientSite
, 0, (HWND
) GetHWND(), NULL
);
604 m_oleObject
->Close(OLECLOSE_NOSAVE
);
605 m_oleObject
->SetClientSite(NULL
);
609 void wxActiveXContainer::CreateActiveX(REFIID iid
, IUnknown
* pUnk
)
612 hret
= m_ActiveX
.QueryInterface(iid
, pUnk
);
613 wxASSERT(SUCCEEDED(hret
));
616 FrameSite
*frame
= new FrameSite(m_realparent
, this);
618 hret
= m_clientSite
.QueryInterface(
619 IID_IOleClientSite
, (IDispatch
*) frame
);
620 wxASSERT(SUCCEEDED(hret
));
622 wxAutoIAdviseSink
adviseSink(IID_IAdviseSink
, (IDispatch
*) frame
);
623 wxASSERT(adviseSink
.Ok());
625 // Get Dispatch interface
626 hret
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);
628 // Get IOleObject interface
629 hret
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);
630 wxASSERT(SUCCEEDED(hret
));
632 // get IViewObject Interface
633 hret
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);
634 wxASSERT(SUCCEEDED(hret
));
637 m_docAdviseCookie
= 0;
638 hret
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
);
639 m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
);
640 OleSetContainedObject(m_oleObject
, TRUE
);
644 // Get IOleInPlaceObject interface
645 hret
= m_oleInPlaceObject
.QueryInterface(
646 IID_IOleInPlaceObject
, m_ActiveX
);
647 wxASSERT(SUCCEEDED(hret
));
651 m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
);
652 wxASSERT(SUCCEEDED(hret
));
654 // set client site first ?
655 if (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
)
656 m_oleObject
->SetClientSite(m_clientSite
);
660 wxAutoIPersistStreamInit
661 pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
);
663 if (pPersistStreamInit
.Ok())
665 hret
= pPersistStreamInit
->InitNew();
668 if (! (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
))
669 m_oleObject
->SetClientSite(m_clientSite
);
673 ::GetClientRect((HWND
)m_realparent
->GetHWND(), &posRect
);
677 if (m_oleInPlaceObject
.Ok())
679 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
681 ::SetActiveWindow(m_oleObjectHWND
);
685 if (! (dwMiscStatus
& OLEMISC_INVISIBLEATRUNTIME
))
687 if (posRect
.right
> 0 && posRect
.bottom
> 0 &&
688 m_oleInPlaceObject
.Ok())
689 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
691 hret
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
,
692 m_clientSite
, 0, (HWND
)m_realparent
->GetHWND(), &posRect
);
693 hret
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0,
694 (HWND
)m_realparent
->GetHWND(), &posRect
);
697 if (! m_oleObjectHWND
&& m_oleInPlaceObject
.Ok())
699 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
704 ::SetActiveWindow(m_oleObjectHWND
);
705 ::ShowWindow(m_oleObjectHWND
, SW_SHOW
);
707 this->AssociateHandle(m_oleObjectHWND
);
708 this->Reparent(m_realparent
);
710 wxWindow
* pWnd
= m_realparent
;
711 int id
= m_realparent
->GetId();
713 pWnd
->Connect(id
, wxEVT_SIZE
,
714 wxSizeEventHandler(wxActiveXContainer::OnSize
), 0, this);
715 pWnd
->Connect(id
, wxEVT_SET_FOCUS
,
716 wxFocusEventHandler(wxActiveXContainer::OnSetFocus
), 0, this);
717 pWnd
->Connect(id
, wxEVT_KILL_FOCUS
,
718 wxFocusEventHandler(wxActiveXContainer::OnKillFocus
), 0, this);
722 #define HIMETRIC_PER_INCH 2540
723 #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
725 static void PixelsToHimetric(SIZEL
&sz
)
733 HDC dc
= GetDC(NULL
);
734 logX
= GetDeviceCaps(dc
, LOGPIXELSX
);
735 logY
= GetDeviceCaps(dc
, LOGPIXELSY
);
739 #define HIMETRIC_INCH 2540
740 #define CONVERT(x, logpixels) MulDiv(HIMETRIC_INCH, (x), (logpixels))
742 sz
.cx
= CONVERT(sz
.cx
, logX
);
743 sz
.cy
= CONVERT(sz
.cy
, logY
);
750 void wxActiveXContainer::OnSize(wxSizeEvent
& event
)
753 GetParent()->GetClientSize(&w
, &h
);
761 if (w
<= 0 && h
<= 0)
764 // extents are in HIMETRIC units
765 if (m_oleObject
.Ok())
768 PixelsToHimetric(sz
);
772 m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
);
773 if (sz2
.cx
!= sz
.cx
|| sz
.cy
!= sz2
.cy
)
774 m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
);
777 if (m_oleInPlaceObject
.Ok())
778 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
783 void wxActiveXContainer::OnPaint(wxPaintEvent
& WXUNUSED(event
))
786 // Draw only when control is windowless or deactivated
791 GetParent()->GetSize(&w
, &h
);
798 ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
);
799 RECTL
*prcBounds
= (RECTL
*) &posRect
;
800 m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,
801 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0);
806 // We've got this one I think
810 void wxActiveXContainer::OnSetFocus(wxFocusEvent
& event
)
812 if (m_oleInPlaceActiveObject
.Ok())
813 m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
);
818 void wxActiveXContainer::OnKillFocus(wxFocusEvent
& event
)
820 if (m_oleInPlaceActiveObject
.Ok())
821 m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
);