UIActiveX.cpp 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241
  1. #include "StdAfx.h"
  2. namespace DuiLib {
  3. /////////////////////////////////////////////////////////////////////////////////////
  4. //
  5. //
  6. class CActiveXCtrl;
  7. /////////////////////////////////////////////////////////////////////////////////////
  8. //
  9. //
  10. class CActiveXWnd : public CWindowWnd
  11. {
  12. public:
  13. CActiveXWnd() : m_iLayeredTick(0), m_bDrawCaret(false) {}
  14. HWND Init(CActiveXCtrl* pOwner, HWND hWndParent);
  15. LPCTSTR GetWindowClassName() const;
  16. void OnFinalMessage(HWND hWnd);
  17. LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  18. protected:
  19. void DoVerb(LONG iVerb);
  20. LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  21. LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  22. LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  23. LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  24. LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  25. LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  26. LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  27. LRESULT OnPrint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  28. protected:
  29. enum {
  30. DEFAULT_TIMERID = 20,
  31. };
  32. CActiveXCtrl* m_pOwner;
  33. int m_iLayeredTick;
  34. bool m_bDrawCaret;
  35. };
  36. /////////////////////////////////////////////////////////////////////////////////////
  37. //
  38. //
  39. class CActiveXEnum : public IEnumUnknown
  40. {
  41. public:
  42. CActiveXEnum(IUnknown* pUnk) : m_pUnk(pUnk), m_dwRef(1), m_iPos(0)
  43. {
  44. m_pUnk->AddRef();
  45. }
  46. ~CActiveXEnum()
  47. {
  48. m_pUnk->Release();
  49. }
  50. LONG m_iPos;
  51. ULONG m_dwRef;
  52. IUnknown* m_pUnk;
  53. STDMETHOD_(ULONG,AddRef)()
  54. {
  55. return ++m_dwRef;
  56. }
  57. STDMETHOD_(ULONG,Release)()
  58. {
  59. LONG lRef = --m_dwRef;
  60. if( lRef == 0 ) delete this;
  61. return lRef;
  62. }
  63. STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
  64. {
  65. *ppvObject = NULL;
  66. if( riid == IID_IUnknown ) *ppvObject = static_cast<IEnumUnknown*>(this);
  67. else if( riid == IID_IEnumUnknown ) *ppvObject = static_cast<IEnumUnknown*>(this);
  68. if( *ppvObject != NULL ) AddRef();
  69. return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
  70. }
  71. STDMETHOD(Next)(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
  72. {
  73. if( pceltFetched != NULL ) *pceltFetched = 0;
  74. if( ++m_iPos > 1 ) return S_FALSE;
  75. *rgelt = m_pUnk;
  76. (*rgelt)->AddRef();
  77. if( pceltFetched != NULL ) *pceltFetched = 1;
  78. return S_OK;
  79. }
  80. STDMETHOD(Skip)(ULONG celt)
  81. {
  82. m_iPos += celt;
  83. return S_OK;
  84. }
  85. STDMETHOD(Reset)(void)
  86. {
  87. m_iPos = 0;
  88. return S_OK;
  89. }
  90. STDMETHOD(Clone)(IEnumUnknown **ppenum)
  91. {
  92. return E_NOTIMPL;
  93. }
  94. };
  95. /////////////////////////////////////////////////////////////////////////////////////
  96. //
  97. //
  98. class CActiveXFrameWnd : public IOleInPlaceFrame
  99. {
  100. public:
  101. CActiveXFrameWnd(CActiveXUI* pOwner) : m_dwRef(1), m_pOwner(pOwner), m_pActiveObject(NULL)
  102. {
  103. }
  104. ~CActiveXFrameWnd()
  105. {
  106. if( m_pActiveObject != NULL ) m_pActiveObject->Release();
  107. }
  108. ULONG m_dwRef;
  109. CActiveXUI* m_pOwner;
  110. IOleInPlaceActiveObject* m_pActiveObject;
  111. // IUnknown
  112. STDMETHOD_(ULONG,AddRef)()
  113. {
  114. return ++m_dwRef;
  115. }
  116. STDMETHOD_(ULONG,Release)()
  117. {
  118. ULONG lRef = --m_dwRef;
  119. if( lRef == 0 ) delete this;
  120. return lRef;
  121. }
  122. STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
  123. {
  124. *ppvObject = NULL;
  125. if( riid == IID_IUnknown ) *ppvObject = static_cast<IOleInPlaceFrame*>(this);
  126. else if( riid == IID_IOleWindow ) *ppvObject = static_cast<IOleWindow*>(this);
  127. else if( riid == IID_IOleInPlaceFrame ) *ppvObject = static_cast<IOleInPlaceFrame*>(this);
  128. else if( riid == IID_IOleInPlaceUIWindow ) *ppvObject = static_cast<IOleInPlaceUIWindow*>(this);
  129. if( *ppvObject != NULL ) AddRef();
  130. return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
  131. }
  132. // IOleInPlaceFrameWindow
  133. STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/)
  134. {
  135. return S_OK;
  136. }
  137. STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/)
  138. {
  139. return S_OK;
  140. }
  141. STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/)
  142. {
  143. return S_OK;
  144. }
  145. STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/)
  146. {
  147. return S_OK;
  148. }
  149. STDMETHOD(EnableModeless)(BOOL /*fEnable*/)
  150. {
  151. return S_OK;
  152. }
  153. STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/)
  154. {
  155. return S_FALSE;
  156. }
  157. // IOleWindow
  158. STDMETHOD(GetWindow)(HWND* phwnd)
  159. {
  160. if( m_pOwner == NULL ) return E_UNEXPECTED;
  161. *phwnd = m_pOwner->GetManager()->GetPaintWindow();
  162. return S_OK;
  163. }
  164. STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
  165. {
  166. return S_OK;
  167. }
  168. // IOleInPlaceUIWindow
  169. STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
  170. {
  171. return S_OK;
  172. }
  173. STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
  174. {
  175. return INPLACE_E_NOTOOLSPACE;
  176. }
  177. STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
  178. {
  179. return S_OK;
  180. }
  181. STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
  182. {
  183. if( pActiveObject != NULL ) pActiveObject->AddRef();
  184. if( m_pActiveObject != NULL ) m_pActiveObject->Release();
  185. m_pActiveObject = pActiveObject;
  186. return S_OK;
  187. }
  188. };
  189. /////////////////////////////////////////////////////////////////////////////////////
  190. //
  191. class CActiveXCtrl :
  192. public IOleClientSite,
  193. public IOleInPlaceSiteWindowless,
  194. public IOleControlSite,
  195. public IObjectWithSite,
  196. public IOleContainer
  197. {
  198. friend class CActiveXUI;
  199. friend class CActiveXWnd;
  200. public:
  201. CActiveXCtrl();
  202. ~CActiveXCtrl();
  203. // IUnknown
  204. STDMETHOD_(ULONG,AddRef)();
  205. STDMETHOD_(ULONG,Release)();
  206. STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject);
  207. // IObjectWithSite
  208. STDMETHOD(SetSite)(IUnknown *pUnkSite);
  209. STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite);
  210. // IOleClientSite
  211. STDMETHOD(SaveObject)(void);
  212. STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
  213. STDMETHOD(GetContainer)(IOleContainer** ppContainer);
  214. STDMETHOD(ShowObject)(void);
  215. STDMETHOD(OnShowWindow)(BOOL fShow);
  216. STDMETHOD(RequestNewObjectLayout)(void);
  217. // IOleInPlaceSiteWindowless
  218. STDMETHOD(CanWindowlessActivate)(void);
  219. STDMETHOD(GetCapture)(void);
  220. STDMETHOD(SetCapture)(BOOL fCapture);
  221. STDMETHOD(GetFocus)(void);
  222. STDMETHOD(SetFocus)(BOOL fFocus);
  223. STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);
  224. STDMETHOD(ReleaseDC)(HDC hDC);
  225. STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);
  226. STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);
  227. STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
  228. STDMETHOD(AdjustRect)(LPRECT prc);
  229. STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);
  230. // IOleInPlaceSiteEx
  231. STDMETHOD(OnInPlaceActivateEx)(BOOL *pfNoRedraw, DWORD dwFlags);
  232. STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);
  233. STDMETHOD(RequestUIActivate)(void);
  234. // IOleInPlaceSite
  235. STDMETHOD(CanInPlaceActivate)(void);
  236. STDMETHOD(OnInPlaceActivate)(void);
  237. STDMETHOD(OnUIActivate)(void);
  238. STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
  239. STDMETHOD(Scroll)(SIZE scrollExtant);
  240. STDMETHOD(OnUIDeactivate)(BOOL fUndoable);
  241. STDMETHOD(OnInPlaceDeactivate)(void);
  242. STDMETHOD(DiscardUndoState)( void);
  243. STDMETHOD(DeactivateAndUndo)( void);
  244. STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);
  245. // IOleWindow
  246. STDMETHOD(GetWindow)(HWND* phwnd);
  247. STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
  248. // IOleControlSite
  249. STDMETHOD(OnControlInfoChanged)(void);
  250. STDMETHOD(LockInPlaceActive)(BOOL fLock);
  251. STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);
  252. STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);
  253. STDMETHOD(TranslateAccelerator)(MSG* pMsg, DWORD grfModifiers);
  254. STDMETHOD(OnFocus)(BOOL fGotFocus);
  255. STDMETHOD(ShowPropertyFrame)(void);
  256. // IOleContainer
  257. STDMETHOD(EnumObjects)(DWORD grfFlags, IEnumUnknown** ppenum);
  258. STDMETHOD(LockContainer)(BOOL fLock);
  259. // IParseDisplayName
  260. STDMETHOD(ParseDisplayName)(IBindCtx* pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
  261. protected:
  262. HRESULT CreateActiveXWnd();
  263. protected:
  264. LONG m_dwRef;
  265. CActiveXUI* m_pOwner;
  266. CActiveXWnd* m_pWindow;
  267. IUnknown* m_pUnkSite;
  268. IViewObject* m_pViewObject;
  269. IOleInPlaceObjectWindowless* m_pInPlaceObject;
  270. bool m_bLocked;
  271. bool m_bFocused;
  272. bool m_bCaptured;
  273. bool m_bUIActivated;
  274. bool m_bInPlaceActive;
  275. bool m_bWindowless;
  276. };
  277. CActiveXCtrl::CActiveXCtrl() :
  278. m_dwRef(1),
  279. m_pOwner(NULL),
  280. m_pWindow(NULL),
  281. m_pUnkSite(NULL),
  282. m_pViewObject(NULL),
  283. m_pInPlaceObject(NULL),
  284. m_bLocked(false),
  285. m_bFocused(false),
  286. m_bCaptured(false),
  287. m_bWindowless(true),
  288. m_bUIActivated(false),
  289. m_bInPlaceActive(false)
  290. {
  291. }
  292. CActiveXCtrl::~CActiveXCtrl()
  293. {
  294. if( m_pWindow != NULL ) {
  295. ::DestroyWindow(*m_pWindow);
  296. delete m_pWindow;
  297. }
  298. if( m_pUnkSite != NULL ) m_pUnkSite->Release();
  299. if( m_pViewObject != NULL ) m_pViewObject->Release();
  300. if( m_pInPlaceObject != NULL ) m_pInPlaceObject->Release();
  301. }
  302. STDMETHODIMP CActiveXCtrl::QueryInterface(REFIID riid, LPVOID *ppvObject)
  303. {
  304. *ppvObject = NULL;
  305. if( riid == IID_IUnknown ) *ppvObject = static_cast<IOleWindow*>(this);
  306. else if( riid == IID_IOleClientSite ) *ppvObject = static_cast<IOleClientSite*>(this);
  307. else if( riid == IID_IOleInPlaceSiteWindowless ) *ppvObject = static_cast<IOleInPlaceSiteWindowless*>(this);
  308. else if( riid == IID_IOleInPlaceSiteEx ) *ppvObject = static_cast<IOleInPlaceSiteEx*>(this);
  309. else if( riid == IID_IOleInPlaceSite ) *ppvObject = static_cast<IOleInPlaceSite*>(this);
  310. else if( riid == IID_IOleWindow ) *ppvObject = static_cast<IOleWindow*>(this);
  311. else if( riid == IID_IOleControlSite ) *ppvObject = static_cast<IOleControlSite*>(this);
  312. else if( riid == IID_IOleContainer ) *ppvObject = static_cast<IOleContainer*>(this);
  313. else if( riid == IID_IObjectWithSite ) *ppvObject = static_cast<IObjectWithSite*>(this);
  314. if( *ppvObject != NULL ) AddRef();
  315. return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
  316. }
  317. STDMETHODIMP_(ULONG) CActiveXCtrl::AddRef()
  318. {
  319. return ++m_dwRef;
  320. }
  321. STDMETHODIMP_(ULONG) CActiveXCtrl::Release()
  322. {
  323. LONG lRef = --m_dwRef;
  324. if( lRef == 0 ) delete this;
  325. return lRef;
  326. }
  327. STDMETHODIMP CActiveXCtrl::SetSite(IUnknown *pUnkSite)
  328. {
  329. DUITRACE(_T("AX: CActiveXCtrl::SetSite"));
  330. if( m_pUnkSite != NULL ) {
  331. m_pUnkSite->Release();
  332. m_pUnkSite = NULL;
  333. }
  334. if( pUnkSite != NULL ) {
  335. m_pUnkSite = pUnkSite;
  336. m_pUnkSite->AddRef();
  337. }
  338. return S_OK;
  339. }
  340. STDMETHODIMP CActiveXCtrl::GetSite(REFIID riid, LPVOID* ppvSite)
  341. {
  342. DUITRACE(_T("AX: CActiveXCtrl::GetSite"));
  343. if( ppvSite == NULL ) return E_POINTER;
  344. *ppvSite = NULL;
  345. if( m_pUnkSite == NULL ) return E_FAIL;
  346. return m_pUnkSite->QueryInterface(riid, ppvSite);
  347. }
  348. STDMETHODIMP CActiveXCtrl::SaveObject(void)
  349. {
  350. DUITRACE(_T("AX: CActiveXCtrl::SaveObject"));
  351. return E_NOTIMPL;
  352. }
  353. STDMETHODIMP CActiveXCtrl::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk)
  354. {
  355. DUITRACE(_T("AX: CActiveXCtrl::GetMoniker"));
  356. if( ppmk != NULL ) *ppmk = NULL;
  357. return E_NOTIMPL;
  358. }
  359. STDMETHODIMP CActiveXCtrl::GetContainer(IOleContainer** ppContainer)
  360. {
  361. DUITRACE(_T("AX: CActiveXCtrl::GetContainer"));
  362. if( ppContainer == NULL ) return E_POINTER;
  363. *ppContainer = NULL;
  364. HRESULT Hr = E_NOTIMPL;
  365. if( m_pUnkSite != NULL ) Hr = m_pUnkSite->QueryInterface(IID_IOleContainer, (LPVOID*) ppContainer);
  366. if( FAILED(Hr) ) Hr = QueryInterface(IID_IOleContainer, (LPVOID*) ppContainer);
  367. return Hr;
  368. }
  369. STDMETHODIMP CActiveXCtrl::ShowObject(void)
  370. {
  371. DUITRACE(_T("AX: CActiveXCtrl::ShowObject"));
  372. if( m_pOwner == NULL ) return E_UNEXPECTED;
  373. HDC hDC = ::GetDC(m_pOwner->m_hwndHost);
  374. if( hDC == NULL ) return E_FAIL;
  375. if( m_pViewObject != NULL ) m_pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hDC, (RECTL*) &m_pOwner->m_rcItem, (RECTL*) &m_pOwner->m_rcItem, NULL, NULL);
  376. ::ReleaseDC(m_pOwner->m_hwndHost, hDC);
  377. return S_OK;
  378. }
  379. STDMETHODIMP CActiveXCtrl::OnShowWindow(BOOL fShow)
  380. {
  381. DUITRACE(_T("AX: CActiveXCtrl::OnShowWindow"));
  382. return E_NOTIMPL;
  383. }
  384. STDMETHODIMP CActiveXCtrl::RequestNewObjectLayout(void)
  385. {
  386. DUITRACE(_T("AX: CActiveXCtrl::RequestNewObjectLayout"));
  387. return E_NOTIMPL;
  388. }
  389. STDMETHODIMP CActiveXCtrl::CanWindowlessActivate(void)
  390. {
  391. DUITRACE(_T("AX: CActiveXCtrl::CanWindowlessActivate"));
  392. return S_OK; // Yes, we can!!
  393. }
  394. STDMETHODIMP CActiveXCtrl::GetCapture(void)
  395. {
  396. DUITRACE(_T("AX: CActiveXCtrl::GetCapture"));
  397. if( m_pOwner == NULL ) return E_UNEXPECTED;
  398. return m_bCaptured ? S_OK : S_FALSE;
  399. }
  400. STDMETHODIMP CActiveXCtrl::SetCapture(BOOL fCapture)
  401. {
  402. DUITRACE(_T("AX: CActiveXCtrl::SetCapture"));
  403. if( m_pOwner == NULL ) return E_UNEXPECTED;
  404. m_bCaptured = (fCapture == TRUE);
  405. if( fCapture ) ::SetCapture(m_pOwner->m_hwndHost); else ::ReleaseCapture();
  406. return S_OK;
  407. }
  408. STDMETHODIMP CActiveXCtrl::GetFocus(void)
  409. {
  410. DUITRACE(_T("AX: CActiveXCtrl::GetFocus"));
  411. if( m_pOwner == NULL ) return E_UNEXPECTED;
  412. return m_bFocused ? S_OK : S_FALSE;
  413. }
  414. STDMETHODIMP CActiveXCtrl::SetFocus(BOOL fFocus)
  415. {
  416. DUITRACE(_T("AX: CActiveXCtrl::SetFocus"));
  417. if( m_pOwner == NULL ) return E_UNEXPECTED;
  418. if( fFocus ) m_pOwner->SetFocus();
  419. m_bFocused = (fFocus == TRUE);
  420. return S_OK;
  421. }
  422. STDMETHODIMP CActiveXCtrl::GetDC(LPCRECT pRect, DWORD grfFlags, HDC* phDC)
  423. {
  424. DUITRACE(_T("AX: CActiveXCtrl::GetDC"));
  425. if( phDC == NULL ) return E_POINTER;
  426. if( m_pOwner == NULL ) return E_UNEXPECTED;
  427. if( m_bWindowless ) return S_FALSE;
  428. *phDC = ::GetDC(m_pOwner->m_hwndHost);
  429. if( (grfFlags & OLEDC_PAINTBKGND) != 0 ) {
  430. CDuiRect rcItem = m_pOwner->GetPos();
  431. if( !m_bWindowless ) rcItem.ResetOffset();
  432. ::FillRect(*phDC, &rcItem, (HBRUSH) (COLOR_WINDOW + 1));
  433. }
  434. return S_OK;
  435. }
  436. STDMETHODIMP CActiveXCtrl::ReleaseDC(HDC hDC)
  437. {
  438. DUITRACE(_T("AX: CActiveXCtrl::ReleaseDC"));
  439. if( m_pOwner == NULL ) return E_UNEXPECTED;
  440. ::ReleaseDC(m_pOwner->m_hwndHost, hDC);
  441. return S_OK;
  442. }
  443. STDMETHODIMP CActiveXCtrl::InvalidateRect(LPCRECT pRect, BOOL fErase)
  444. {
  445. DUITRACE(_T("AX: CActiveXCtrl::InvalidateRect"));
  446. if( m_pOwner == NULL ) return E_UNEXPECTED;
  447. if( m_pOwner->m_hwndHost == NULL ) return E_FAIL;
  448. return ::InvalidateRect(m_pOwner->m_hwndHost, pRect, fErase) ? S_OK : E_FAIL;
  449. }
  450. STDMETHODIMP CActiveXCtrl::InvalidateRgn(HRGN hRGN, BOOL fErase)
  451. {
  452. DUITRACE(_T("AX: CActiveXCtrl::InvalidateRgn"));
  453. if( m_pOwner == NULL ) return E_UNEXPECTED;
  454. return ::InvalidateRgn(m_pOwner->m_hwndHost, hRGN, fErase) ? S_OK : E_FAIL;
  455. }
  456. STDMETHODIMP CActiveXCtrl::ScrollRect(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip)
  457. {
  458. DUITRACE(_T("AX: CActiveXCtrl::ScrollRect"));
  459. return S_OK;
  460. }
  461. STDMETHODIMP CActiveXCtrl::AdjustRect(LPRECT prc)
  462. {
  463. DUITRACE(_T("AX: CActiveXCtrl::AdjustRect"));
  464. return S_OK;
  465. }
  466. STDMETHODIMP CActiveXCtrl::OnDefWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult)
  467. {
  468. DUITRACE(_T("AX: CActiveXCtrl::OnDefWindowMessage"));
  469. if( m_pOwner == NULL ) return E_UNEXPECTED;
  470. *plResult = ::DefWindowProc(m_pOwner->m_hwndHost, msg, wParam, lParam);
  471. return S_OK;
  472. }
  473. STDMETHODIMP CActiveXCtrl::OnInPlaceActivateEx(BOOL* pfNoRedraw, DWORD dwFlags)
  474. {
  475. DUITRACE(_T("AX: CActiveXCtrl::OnInPlaceActivateEx"));
  476. ASSERT(m_pInPlaceObject==NULL);
  477. if( m_pOwner == NULL ) return E_UNEXPECTED;
  478. if( m_pOwner->m_pUnk == NULL ) return E_UNEXPECTED;
  479. ::OleLockRunning(m_pOwner->m_pUnk, TRUE, FALSE);
  480. HWND hWndFrame = m_pOwner->GetManager()->GetPaintWindow();
  481. HRESULT Hr = E_FAIL;
  482. if( (dwFlags & ACTIVATE_WINDOWLESS) != 0 ) {
  483. m_bWindowless = true;
  484. Hr = m_pOwner->m_pUnk->QueryInterface(IID_IOleInPlaceObjectWindowless, (LPVOID*) &m_pInPlaceObject);
  485. m_pOwner->m_hwndHost = hWndFrame;
  486. m_pOwner->GetManager()->AddMessageFilter(m_pOwner);
  487. }
  488. if( FAILED(Hr) ) {
  489. m_bWindowless = false;
  490. Hr = CreateActiveXWnd();
  491. if( FAILED(Hr) ) return Hr;
  492. Hr = m_pOwner->m_pUnk->QueryInterface(IID_IOleInPlaceObject, (LPVOID*) &m_pInPlaceObject);
  493. }
  494. if( m_pInPlaceObject != NULL ) {
  495. CDuiRect rcItem = m_pOwner->m_rcItem;
  496. if( !m_bWindowless ) rcItem.ResetOffset();
  497. m_pInPlaceObject->SetObjectRects(&rcItem, &rcItem);
  498. }
  499. m_bInPlaceActive = SUCCEEDED(Hr);
  500. return Hr;
  501. }
  502. STDMETHODIMP CActiveXCtrl::OnInPlaceDeactivateEx(BOOL fNoRedraw)
  503. {
  504. DUITRACE(_T("AX: CActiveXCtrl::OnInPlaceDeactivateEx"));
  505. m_bInPlaceActive = false;
  506. if( m_pInPlaceObject != NULL ) {
  507. m_pInPlaceObject->Release();
  508. m_pInPlaceObject = NULL;
  509. }
  510. if( m_pWindow != NULL ) {
  511. ::DestroyWindow(*m_pWindow);
  512. delete m_pWindow;
  513. m_pWindow = NULL;
  514. }
  515. return S_OK;
  516. }
  517. STDMETHODIMP CActiveXCtrl::RequestUIActivate(void)
  518. {
  519. DUITRACE(_T("AX: CActiveXCtrl::RequestUIActivate"));
  520. return S_OK;
  521. }
  522. STDMETHODIMP CActiveXCtrl::CanInPlaceActivate(void)
  523. {
  524. DUITRACE(_T("AX: CActiveXCtrl::CanInPlaceActivate"));
  525. return S_OK;
  526. }
  527. STDMETHODIMP CActiveXCtrl::OnInPlaceActivate(void)
  528. {
  529. DUITRACE(_T("AX: CActiveXCtrl::OnInPlaceActivate"));
  530. BOOL bDummy = FALSE;
  531. return OnInPlaceActivateEx(&bDummy, 0);
  532. }
  533. STDMETHODIMP CActiveXCtrl::OnUIActivate(void)
  534. {
  535. DUITRACE(_T("AX: CActiveXCtrl::OnUIActivate"));
  536. m_bUIActivated = true;
  537. return S_OK;
  538. }
  539. STDMETHODIMP CActiveXCtrl::GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
  540. {
  541. DUITRACE(_T("AX: CActiveXCtrl::GetWindowContext"));
  542. if( ppDoc == NULL ) return E_POINTER;
  543. if( ppFrame == NULL ) return E_POINTER;
  544. if( lprcPosRect == NULL ) return E_POINTER;
  545. if( lprcClipRect == NULL ) return E_POINTER;
  546. if (m_pWindow)
  547. {
  548. ::GetClientRect(m_pWindow->GetHWND(),lprcPosRect);
  549. ::GetClientRect(m_pWindow->GetHWND(),lprcClipRect);
  550. }
  551. *ppFrame = new CActiveXFrameWnd(m_pOwner);
  552. *ppDoc = NULL;
  553. ACCEL ac = { 0 };
  554. HACCEL hac = ::CreateAcceleratorTable(&ac, 1);
  555. lpFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO);
  556. lpFrameInfo->fMDIApp = FALSE;
  557. lpFrameInfo->hwndFrame = m_pOwner->GetManager()->GetPaintWindow();
  558. lpFrameInfo->haccel = hac;
  559. lpFrameInfo->cAccelEntries = 1;
  560. return S_OK;
  561. }
  562. STDMETHODIMP CActiveXCtrl::Scroll(SIZE scrollExtant)
  563. {
  564. DUITRACE(_T("AX: CActiveXCtrl::Scroll"));
  565. return E_NOTIMPL;
  566. }
  567. STDMETHODIMP CActiveXCtrl::OnUIDeactivate(BOOL fUndoable)
  568. {
  569. DUITRACE(_T("AX: CActiveXCtrl::OnUIDeactivate"));
  570. m_bUIActivated = false;
  571. return S_OK;
  572. }
  573. STDMETHODIMP CActiveXCtrl::OnInPlaceDeactivate(void)
  574. {
  575. DUITRACE(_T("AX: CActiveXCtrl::OnInPlaceDeactivate"));
  576. return OnInPlaceDeactivateEx(TRUE);
  577. }
  578. STDMETHODIMP CActiveXCtrl::DiscardUndoState(void)
  579. {
  580. DUITRACE(_T("AX: CActiveXCtrl::DiscardUndoState"));
  581. return E_NOTIMPL;
  582. }
  583. STDMETHODIMP CActiveXCtrl::DeactivateAndUndo(void)
  584. {
  585. DUITRACE(_T("AX: CActiveXCtrl::DeactivateAndUndo"));
  586. return E_NOTIMPL;
  587. }
  588. STDMETHODIMP CActiveXCtrl::OnPosRectChange(LPCRECT lprcPosRect)
  589. {
  590. DUITRACE(_T("AX: CActiveXCtrl::OnPosRectChange"));
  591. return E_NOTIMPL;
  592. }
  593. STDMETHODIMP CActiveXCtrl::GetWindow(HWND* phwnd)
  594. {
  595. DUITRACE(_T("AX: CActiveXCtrl::GetWindow"));
  596. if( m_pOwner == NULL ) return E_UNEXPECTED;
  597. if( m_pOwner->m_hwndHost == NULL ) CreateActiveXWnd();
  598. if( m_pOwner->m_hwndHost == NULL ) return E_FAIL;
  599. *phwnd = m_pOwner->m_hwndHost;
  600. return S_OK;
  601. }
  602. STDMETHODIMP CActiveXCtrl::ContextSensitiveHelp(BOOL fEnterMode)
  603. {
  604. DUITRACE(_T("AX: CActiveXCtrl::ContextSensitiveHelp"));
  605. return S_OK;
  606. }
  607. STDMETHODIMP CActiveXCtrl::OnControlInfoChanged(void)
  608. {
  609. DUITRACE(_T("AX: CActiveXCtrl::OnControlInfoChanged"));
  610. return S_OK;
  611. }
  612. STDMETHODIMP CActiveXCtrl::LockInPlaceActive(BOOL fLock)
  613. {
  614. DUITRACE(_T("AX: CActiveXCtrl::LockInPlaceActive"));
  615. return S_OK;
  616. }
  617. STDMETHODIMP CActiveXCtrl::GetExtendedControl(IDispatch** ppDisp)
  618. {
  619. DUITRACE(_T("AX: CActiveXCtrl::GetExtendedControl"));
  620. if( ppDisp == NULL ) return E_POINTER;
  621. if( m_pOwner == NULL ) return E_UNEXPECTED;
  622. if( m_pOwner->m_pUnk == NULL ) return E_UNEXPECTED;
  623. return m_pOwner->m_pUnk->QueryInterface(IID_IDispatch, (LPVOID*) ppDisp);
  624. }
  625. STDMETHODIMP CActiveXCtrl::TransformCoords(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags)
  626. {
  627. DUITRACE(_T("AX: CActiveXCtrl::TransformCoords"));
  628. return S_OK;
  629. }
  630. STDMETHODIMP CActiveXCtrl::TranslateAccelerator(MSG *pMsg, DWORD grfModifiers)
  631. {
  632. DUITRACE(_T("AX: CActiveXCtrl::TranslateAccelerator"));
  633. return S_FALSE;
  634. }
  635. STDMETHODIMP CActiveXCtrl::OnFocus(BOOL fGotFocus)
  636. {
  637. DUITRACE(_T("AX: CActiveXCtrl::OnFocus"));
  638. m_bFocused = (fGotFocus == TRUE);
  639. return S_OK;
  640. }
  641. STDMETHODIMP CActiveXCtrl::ShowPropertyFrame(void)
  642. {
  643. DUITRACE(_T("AX: CActiveXCtrl::ShowPropertyFrame"));
  644. return E_NOTIMPL;
  645. }
  646. STDMETHODIMP CActiveXCtrl::EnumObjects(DWORD grfFlags, IEnumUnknown** ppenum)
  647. {
  648. DUITRACE(_T("AX: CActiveXCtrl::EnumObjects"));
  649. if( ppenum == NULL ) return E_POINTER;
  650. if( m_pOwner == NULL ) return E_UNEXPECTED;
  651. *ppenum = new CActiveXEnum(m_pOwner->m_pUnk);
  652. return S_OK;
  653. }
  654. STDMETHODIMP CActiveXCtrl::LockContainer(BOOL fLock)
  655. {
  656. DUITRACE(_T("AX: CActiveXCtrl::LockContainer"));
  657. m_bLocked = fLock != FALSE;
  658. return S_OK;
  659. }
  660. STDMETHODIMP CActiveXCtrl::ParseDisplayName(IBindCtx *pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
  661. {
  662. DUITRACE(_T("AX: CActiveXCtrl::ParseDisplayName"));
  663. return E_NOTIMPL;
  664. }
  665. HRESULT CActiveXCtrl::CreateActiveXWnd()
  666. {
  667. if( m_pWindow != NULL ) return S_OK;
  668. m_pWindow = new CActiveXWnd;
  669. if( m_pWindow == NULL ) return E_OUTOFMEMORY;
  670. m_pOwner->m_hwndHost = m_pWindow->Init(this, m_pOwner->GetManager()->GetPaintWindow());
  671. return S_OK;
  672. }
  673. /////////////////////////////////////////////////////////////////////////////////////
  674. //
  675. //
  676. HWND CActiveXWnd::Init(CActiveXCtrl* pOwner, HWND hWndParent)
  677. {
  678. m_pOwner = pOwner;
  679. UINT uStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  680. Create(hWndParent, _T("UIActiveX"), uStyle, 0L, 0,0,0,0, NULL);
  681. return m_hWnd;
  682. }
  683. LPCTSTR CActiveXWnd::GetWindowClassName() const
  684. {
  685. return _T("ActiveXWnd");
  686. }
  687. void CActiveXWnd::OnFinalMessage(HWND hWnd)
  688. {
  689. m_pOwner->m_pOwner->GetManager()->RemoveNativeWindow(hWnd);
  690. //delete this; // 侶쟁꼇矜狼헌잿,CActiveXUI삔헌잿돨
  691. }
  692. void CActiveXWnd::DoVerb(LONG iVerb)
  693. {
  694. if( m_pOwner == NULL ) return;
  695. if( m_pOwner->m_pOwner == NULL ) return;
  696. IOleObject* pUnk = NULL;
  697. m_pOwner->m_pOwner->GetControl(IID_IOleObject, (LPVOID*) &pUnk);
  698. if( pUnk == NULL ) return;
  699. CSafeRelease<IOleObject> RefOleObject = pUnk;
  700. IOleClientSite* pOleClientSite = NULL;
  701. m_pOwner->QueryInterface(IID_IOleClientSite, (LPVOID*) &pOleClientSite);
  702. CSafeRelease<IOleClientSite> RefOleClientSite = pOleClientSite;
  703. pUnk->DoVerb(iVerb, NULL, pOleClientSite, 0, m_hWnd, &m_pOwner->m_pOwner->GetPos());
  704. }
  705. LRESULT CActiveXWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  706. {
  707. LRESULT lRes=0;
  708. BOOL bHandled = TRUE;
  709. switch( uMsg ) {
  710. case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;
  711. case WM_TIMER: lRes = OnTimer(uMsg, wParam, lParam, bHandled); break;
  712. case WM_PAINT: lRes = OnPaint(uMsg, wParam, lParam, bHandled); break;
  713. case WM_PRINT: lRes = OnPrint(uMsg, wParam, lParam, bHandled); break;
  714. case WM_SETFOCUS: lRes = OnSetFocus(uMsg, wParam, lParam, bHandled); break;
  715. case WM_KILLFOCUS: lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break;
  716. case WM_ERASEBKGND: lRes = OnEraseBkgnd(uMsg, wParam, lParam, bHandled); break;
  717. case WM_MOUSEACTIVATE: lRes = OnMouseActivate(uMsg, wParam, lParam, bHandled); break;
  718. case WM_MOUSEWHEEL: break;
  719. default:
  720. bHandled = FALSE;
  721. }
  722. if( !bHandled ) return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  723. return lRes;
  724. }
  725. LRESULT CActiveXWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  726. {
  727. m_pOwner->m_pOwner->GetManager()->AddNativeWindow(m_pOwner->m_pOwner, m_hWnd);
  728. if( m_pOwner->m_pOwner->GetManager()->IsLayered() ) {
  729. ::SetTimer(m_hWnd, DEFAULT_TIMERID, 50, NULL);
  730. }
  731. return 0;
  732. }
  733. LRESULT CActiveXWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  734. {
  735. if (wParam == DEFAULT_TIMERID) {
  736. if (m_pOwner->m_pOwner->GetManager()->IsLayered()) {
  737. m_pOwner->m_pOwner->GetManager()->AddNativeWindow(m_pOwner->m_pOwner, m_hWnd);
  738. m_iLayeredTick += 1;
  739. if (m_iLayeredTick >= 10) {
  740. m_iLayeredTick = 0;
  741. m_bDrawCaret = !m_bDrawCaret;
  742. }
  743. }
  744. return 0;
  745. }
  746. bHandled = FALSE;
  747. return 0;
  748. }
  749. LRESULT CActiveXWnd::OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  750. {
  751. if( m_pOwner->m_pViewObject == NULL ) bHandled = FALSE;
  752. return 1;
  753. }
  754. LRESULT CActiveXWnd::OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  755. {
  756. IOleObject* pUnk = NULL;
  757. m_pOwner->m_pOwner->GetControl(IID_IOleObject, (LPVOID*) &pUnk);
  758. if( pUnk == NULL ) return 0;
  759. CSafeRelease<IOleObject> RefOleObject = pUnk;
  760. DWORD dwMiscStatus = 0;
  761. pUnk->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus);
  762. if( (dwMiscStatus & OLEMISC_NOUIACTIVATE) != 0 ) return 0;
  763. if( !m_pOwner->m_bInPlaceActive ) DoVerb(OLEIVERB_INPLACEACTIVATE);
  764. bHandled = FALSE;
  765. return 0;
  766. }
  767. LRESULT CActiveXWnd::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  768. {
  769. bHandled = FALSE;
  770. m_pOwner->m_bFocused = true;
  771. if( !m_pOwner->m_bUIActivated ) DoVerb(OLEIVERB_UIACTIVATE);
  772. return 0;
  773. }
  774. LRESULT CActiveXWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  775. {
  776. bHandled = FALSE;
  777. m_pOwner->m_bFocused = false;
  778. return 0;
  779. }
  780. LRESULT CActiveXWnd::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  781. {
  782. PAINTSTRUCT ps = { 0 };
  783. ::BeginPaint(m_hWnd, &ps);
  784. ::EndPaint(m_hWnd, &ps);
  785. return 1;
  786. }
  787. LRESULT CActiveXWnd::OnPrint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  788. {
  789. RECT rcClient;
  790. ::GetClientRect(m_hWnd, &rcClient);
  791. m_pOwner->m_pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, (HDC)wParam, (RECTL*) &rcClient, NULL, NULL, NULL);
  792. if (m_bDrawCaret ) {
  793. RECT rcPos = m_pOwner->m_pOwner->GetPos();
  794. GUITHREADINFO guiThreadInfo;
  795. guiThreadInfo.cbSize = sizeof(GUITHREADINFO);
  796. ::GetGUIThreadInfo(NULL, &guiThreadInfo);
  797. if (guiThreadInfo.hwndCaret) {
  798. POINT ptCaret;
  799. ptCaret.x = guiThreadInfo.rcCaret.left;
  800. ptCaret.y = guiThreadInfo.rcCaret.top;
  801. ::ClientToScreen(guiThreadInfo.hwndCaret, &ptCaret);
  802. ::ScreenToClient(m_pOwner->m_pOwner->GetManager()->GetPaintWindow(), &ptCaret);
  803. if( ::PtInRect(&rcPos, ptCaret) ) {
  804. RECT rcCaret;
  805. rcCaret = guiThreadInfo.rcCaret;
  806. rcCaret.right = rcCaret.left;
  807. CRenderEngine::DrawLine((HDC)wParam, rcCaret, 1, 0xFF000000);
  808. }
  809. }
  810. }
  811. return 1;
  812. }
  813. /////////////////////////////////////////////////////////////////////////////////////
  814. //
  815. //
  816. CActiveXUI::CActiveXUI() : m_pUnk(NULL), m_pControl(NULL), m_hwndHost(NULL), m_bCreated(false), m_bDelayCreate(true)
  817. {
  818. m_clsid = IID_NULL;
  819. ::CoInitialize(NULL);
  820. }
  821. CActiveXUI::~CActiveXUI()
  822. {
  823. ReleaseControl();
  824. ::CoUninitialize();
  825. }
  826. LPCTSTR CActiveXUI::GetClass() const
  827. {
  828. return _T("ActiveXUI");
  829. }
  830. LPVOID CActiveXUI::GetInterface(LPCTSTR pstrName)
  831. {
  832. if( _tcscmp(pstrName, DUI_CTR_ACTIVEX) == 0 ) return static_cast<CActiveXUI*>(this);
  833. return CControlUI::GetInterface(pstrName);
  834. }
  835. UINT CActiveXUI::GetControlFlags() const
  836. {
  837. return UIFLAG_TABSTOP;
  838. }
  839. HWND CActiveXUI::GetNativeWindow() const
  840. {
  841. return m_hwndHost;
  842. }
  843. static void PixelToHiMetric(const SIZEL* lpSizeInPix, LPSIZEL lpSizeInHiMetric)
  844. {
  845. #define HIMETRIC_PER_INCH 2540
  846. #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
  847. #define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH)
  848. int nPixelsPerInchX; // Pixels per logical inch along width
  849. int nPixelsPerInchY; // Pixels per logical inch along height
  850. HDC hDCScreen = ::GetDC(NULL);
  851. nPixelsPerInchX = ::GetDeviceCaps(hDCScreen, LOGPIXELSX);
  852. nPixelsPerInchY = ::GetDeviceCaps(hDCScreen, LOGPIXELSY);
  853. ::ReleaseDC(NULL, hDCScreen);
  854. lpSizeInHiMetric->cx = MAP_PIX_TO_LOGHIM(lpSizeInPix->cx, nPixelsPerInchX);
  855. lpSizeInHiMetric->cy = MAP_PIX_TO_LOGHIM(lpSizeInPix->cy, nPixelsPerInchY);
  856. }
  857. void CActiveXUI::SetVisible(bool bVisible)
  858. {
  859. CControlUI::SetVisible(bVisible);
  860. if( m_hwndHost != NULL && !m_pControl->m_bWindowless )
  861. ::ShowWindow(m_hwndHost, IsVisible() ? SW_SHOW : SW_HIDE);
  862. }
  863. void CActiveXUI::SetInternVisible(bool bVisible)
  864. {
  865. CControlUI::SetInternVisible(bVisible);
  866. if( m_hwndHost != NULL && !m_pControl->m_bWindowless )
  867. ::ShowWindow(m_hwndHost, IsVisible() ? SW_SHOW : SW_HIDE);
  868. }
  869. void CActiveXUI::SetPos(RECT rc, bool bNeedInvalidate)
  870. {
  871. CControlUI::SetPos(rc, bNeedInvalidate);
  872. if( !m_bCreated ) DoCreateControl();
  873. if( m_pUnk == NULL ) return;
  874. if( m_pControl == NULL ) return;
  875. SIZEL hmSize = { 0 };
  876. SIZEL pxSize = { 0 };
  877. pxSize.cx = m_rcItem.right - m_rcItem.left;
  878. pxSize.cy = m_rcItem.bottom - m_rcItem.top;
  879. PixelToHiMetric(&pxSize, &hmSize);
  880. if( m_pUnk != NULL ) {
  881. m_pUnk->SetExtent(DVASPECT_CONTENT, &hmSize);
  882. }
  883. if( m_pControl->m_pInPlaceObject != NULL ) {
  884. CDuiRect rcItem = m_rcItem;
  885. if( !m_pControl->m_bWindowless ) rcItem.ResetOffset();
  886. m_pControl->m_pInPlaceObject->SetObjectRects(&rcItem, &rcItem);
  887. }
  888. if( !m_pControl->m_bWindowless ) {
  889. ASSERT(m_pControl->m_pWindow);
  890. ::MoveWindow(*m_pControl->m_pWindow, m_rcItem.left, m_rcItem.top, m_rcItem.right - m_rcItem.left, m_rcItem.bottom - m_rcItem.top, TRUE);
  891. }
  892. }
  893. void CActiveXUI::Move(SIZE szOffset, bool bNeedInvalidate)
  894. {
  895. CControlUI::Move(szOffset, bNeedInvalidate);
  896. if( !m_pControl->m_bWindowless ) {
  897. ASSERT(m_pControl->m_pWindow);
  898. ::MoveWindow(*m_pControl->m_pWindow, m_rcItem.left, m_rcItem.top, m_rcItem.right - m_rcItem.left, m_rcItem.bottom - m_rcItem.top, TRUE);
  899. }
  900. }
  901. void CActiveXUI::DoPaint(HDC hDC, const RECT& rcPaint)
  902. {
  903. if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return;
  904. if( m_pControl != NULL && m_pControl->m_bWindowless && m_pControl->m_pViewObject != NULL )
  905. {
  906. m_pControl->m_pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hDC, (RECTL*) &m_rcItem, (RECTL*) &m_rcItem, NULL, NULL);
  907. }
  908. }
  909. void CActiveXUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
  910. {
  911. if( _tcscmp(pstrName, _T("clsid")) == 0 ) CreateControl(pstrValue);
  912. else if( _tcscmp(pstrName, _T("modulename")) == 0 ) SetModuleName(pstrValue);
  913. else if( _tcscmp(pstrName, _T("delaycreate")) == 0 ) SetDelayCreate(_tcscmp(pstrValue, _T("true")) == 0);
  914. else CControlUI::SetAttribute(pstrName, pstrValue);
  915. }
  916. LRESULT CActiveXUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
  917. {
  918. if( m_pControl == NULL ) return 0;
  919. ASSERT(m_pControl->m_bWindowless);
  920. if( !m_pControl->m_bInPlaceActive ) return 0;
  921. if( m_pControl->m_pInPlaceObject == NULL ) return 0;
  922. if( !IsMouseEnabled() && uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST ) return 0;
  923. bool bWasHandled = true;
  924. if( (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || uMsg == WM_SETCURSOR ) {
  925. // Mouse message only go when captured or inside rect
  926. DWORD dwHitResult = m_pControl->m_bCaptured ? HITRESULT_HIT : HITRESULT_OUTSIDE;
  927. if( dwHitResult == HITRESULT_OUTSIDE && m_pControl->m_pViewObject != NULL ) {
  928. IViewObjectEx* pViewEx = NULL;
  929. m_pControl->m_pViewObject->QueryInterface(IID_IViewObjectEx, (LPVOID*) &pViewEx);
  930. if( pViewEx != NULL ) {
  931. POINT ptMouse = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
  932. pViewEx->QueryHitPoint(DVASPECT_CONTENT, &m_rcItem, ptMouse, 0, &dwHitResult);
  933. pViewEx->Release();
  934. }
  935. }
  936. if( dwHitResult != HITRESULT_HIT ) return 0;
  937. if( uMsg == WM_SETCURSOR ) bWasHandled = false;
  938. else if( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK || uMsg == WM_RBUTTONDOWN ) {
  939. ::SetFocus(GetManager()->GetPaintWindow());
  940. SetFocus();
  941. }
  942. }
  943. else if( uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST ) {
  944. // Keyboard messages just go when we have focus
  945. if( !IsFocused() ) return 0;
  946. }
  947. else {
  948. switch( uMsg ) {
  949. case WM_HELP:
  950. case WM_CONTEXTMENU:
  951. bWasHandled = false;
  952. break;
  953. default:
  954. return 0;
  955. }
  956. }
  957. LRESULT lResult = 0;
  958. HRESULT Hr = m_pControl->m_pInPlaceObject->OnWindowMessage(uMsg, wParam, lParam, &lResult);
  959. if( Hr == S_OK ) bHandled = bWasHandled;
  960. return lResult;
  961. }
  962. bool CActiveXUI::IsDelayCreate() const
  963. {
  964. return m_bDelayCreate;
  965. }
  966. void CActiveXUI::SetDelayCreate(bool bDelayCreate)
  967. {
  968. if( m_bDelayCreate == bDelayCreate ) return;
  969. if( bDelayCreate == false ) {
  970. if( m_bCreated == false && m_clsid != IID_NULL ) DoCreateControl();
  971. }
  972. m_bDelayCreate = bDelayCreate;
  973. }
  974. bool CActiveXUI::CreateControl(LPCTSTR pstrCLSID)
  975. {
  976. CLSID clsid = { 0 };
  977. OLECHAR szCLSID[100] = { 0 };
  978. #ifndef _UNICODE
  979. ::MultiByteToWideChar(::GetACP(), 0, pstrCLSID, -1, szCLSID, lengthof(szCLSID) - 1);
  980. #else
  981. _tcsncpy(szCLSID, pstrCLSID, lengthof(szCLSID) - 1);
  982. #endif
  983. if( pstrCLSID[0] == '{' ) ::CLSIDFromString(szCLSID, &clsid);
  984. else ::CLSIDFromProgID(szCLSID, &clsid);
  985. return CreateControl(clsid);
  986. }
  987. bool CActiveXUI::CreateControl(const CLSID clsid)
  988. {
  989. ASSERT(clsid!=IID_NULL);
  990. if( clsid == IID_NULL ) return false;
  991. m_bCreated = false;
  992. m_clsid = clsid;
  993. if( !m_bDelayCreate ) DoCreateControl();
  994. return true;
  995. }
  996. void CActiveXUI::ReleaseControl()
  997. {
  998. m_hwndHost = NULL;
  999. if( m_pUnk != NULL ) {
  1000. IObjectWithSite* pSite = NULL;
  1001. m_pUnk->QueryInterface(IID_IObjectWithSite, (LPVOID*) &pSite);
  1002. if( pSite != NULL ) {
  1003. pSite->SetSite(NULL);
  1004. pSite->Release();
  1005. }
  1006. m_pUnk->Close(OLECLOSE_NOSAVE);
  1007. m_pUnk->SetClientSite(NULL);
  1008. m_pUnk->Release();
  1009. m_pUnk = NULL;
  1010. }
  1011. if( m_pControl != NULL ) {
  1012. m_pControl->m_pOwner = NULL;
  1013. m_pControl->Release();
  1014. m_pControl = NULL;
  1015. }
  1016. m_pManager->RemoveMessageFilter(this);
  1017. }
  1018. typedef HRESULT (__stdcall *DllGetClassObjectFunc)(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
  1019. bool CActiveXUI::DoCreateControl()
  1020. {
  1021. ReleaseControl();
  1022. // At this point we'll create the ActiveX control
  1023. m_bCreated = true;
  1024. IOleControl* pOleControl = NULL;
  1025. HRESULT Hr = -1;
  1026. if( !m_sModuleName.IsEmpty() ) {
  1027. HMODULE hModule = ::LoadLibrary((LPCTSTR)m_sModuleName);
  1028. if( hModule != NULL ) {
  1029. IClassFactory* aClassFactory = NULL;
  1030. DllGetClassObjectFunc aDllGetClassObjectFunc = (DllGetClassObjectFunc)::GetProcAddress(hModule, "DllGetClassObject");
  1031. Hr = aDllGetClassObjectFunc(m_clsid, IID_IClassFactory, (LPVOID*)&aClassFactory);
  1032. if( SUCCEEDED(Hr) ) {
  1033. Hr = aClassFactory->CreateInstance(NULL, IID_IOleObject, (LPVOID*)&pOleControl);
  1034. }
  1035. aClassFactory->Release();
  1036. }
  1037. }
  1038. if( FAILED(Hr) ) {
  1039. Hr = ::CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IOleControl, (LPVOID*)&pOleControl);
  1040. }
  1041. ASSERT(SUCCEEDED(Hr));
  1042. if( FAILED(Hr) ) return false;
  1043. pOleControl->QueryInterface(IID_IOleObject, (LPVOID*) &m_pUnk);
  1044. pOleControl->Release();
  1045. if( m_pUnk == NULL ) return false;
  1046. // Create the host too
  1047. m_pControl = new CActiveXCtrl();
  1048. m_pControl->m_pOwner = this;
  1049. // More control creation stuff
  1050. DWORD dwMiscStatus = 0;
  1051. m_pUnk->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus);
  1052. IOleClientSite* pOleClientSite = NULL;
  1053. m_pControl->QueryInterface(IID_IOleClientSite, (LPVOID*) &pOleClientSite);
  1054. CSafeRelease<IOleClientSite> RefOleClientSite = pOleClientSite;
  1055. // Initialize control
  1056. if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) != 0 ) m_pUnk->SetClientSite(pOleClientSite);
  1057. IPersistStreamInit* pPersistStreamInit = NULL;
  1058. m_pUnk->QueryInterface(IID_IPersistStreamInit, (LPVOID*) &pPersistStreamInit);
  1059. if( pPersistStreamInit != NULL ) {
  1060. Hr = pPersistStreamInit->InitNew();
  1061. pPersistStreamInit->Release();
  1062. }
  1063. if( FAILED(Hr) ) return false;
  1064. if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) == 0 ) m_pUnk->SetClientSite(pOleClientSite);
  1065. // Grab the view...
  1066. Hr = m_pUnk->QueryInterface(IID_IViewObjectEx, (LPVOID*) &m_pControl->m_pViewObject);
  1067. if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject2, (LPVOID*) &m_pControl->m_pViewObject);
  1068. if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject, (LPVOID*) &m_pControl->m_pViewObject);
  1069. // Activate and done...
  1070. m_pUnk->SetHostNames(OLESTR("UIActiveX"), NULL);
  1071. if( m_pManager != NULL ) m_pManager->SendNotify((CControlUI*)this, DUI_MSGTYPE_SHOWACTIVEX, 0, 0, false);
  1072. if( (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0 ) {
  1073. Hr = m_pUnk->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pOleClientSite, 0, m_pManager->GetPaintWindow(), &m_rcItem);
  1074. //::RedrawWindow(m_pManager->GetPaintWindow(), &m_rcItem, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
  1075. }
  1076. IObjectWithSite* pSite = NULL;
  1077. m_pUnk->QueryInterface(IID_IObjectWithSite, (LPVOID*) &pSite);
  1078. if( pSite != NULL ) {
  1079. pSite->SetSite(static_cast<IOleClientSite*>(m_pControl));
  1080. pSite->Release();
  1081. }
  1082. return SUCCEEDED(Hr);
  1083. }
  1084. HRESULT CActiveXUI::GetControl(const IID iid, LPVOID* ppRet)
  1085. {
  1086. ASSERT(ppRet!=NULL);
  1087. ASSERT(*ppRet==NULL);
  1088. if( ppRet == NULL ) return E_POINTER;
  1089. if( m_pUnk == NULL ) return E_PENDING;
  1090. return m_pUnk->QueryInterface(iid, (LPVOID*) ppRet);
  1091. }
  1092. CLSID CActiveXUI::GetClisd() const
  1093. {
  1094. return m_clsid;
  1095. }
  1096. CDuiString CActiveXUI::GetModuleName() const
  1097. {
  1098. return m_sModuleName;
  1099. }
  1100. void CActiveXUI::SetModuleName(LPCTSTR pstrText)
  1101. {
  1102. m_sModuleName = pstrText;
  1103. }
  1104. } // namespace DuiLib