OccEx.h
上传用户:hstrip
上传日期:2007-01-02
资源大小:42k
文件大小:8k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. #ifndef __OccEx_h__
  2. #define __OccEx_h__
  3. #ifndef DISPID_DATASOURCE
  4. #pragma pack(push, _AFX_PACKING)
  5. #include "../src/occimpl.h"
  6. #pragma pack(pop)
  7. #endif
  8. class COleControlContainerEx;
  9. class COleControlSiteEx;
  10. class COccManagerEx;
  11. class CWindowlessControl;
  12. /////////////////////////////////////////////////////////////////////////////
  13. // Windowless control container support
  14. // container class supporting windowless activation
  15. class COleControlContainerEx : public COleControlContainer
  16. {
  17. DECLARE_DYNCREATE(COleControlContainerEx);
  18. friend class COccManagerEx;
  19. protected:
  20. COleControlContainerEx();
  21. virtual void Init();
  22. virtual ~COleControlContainerEx();
  23. // Windowless activation
  24. public:
  25. bool m_bSupportWindowlessActivation;
  26. COleControlSiteEx* m_pCapture; // windowless control which has captured the mouse
  27. COleControlSiteEx* m_pFocus; // windowless control wich has the focus
  28. // Ambient properties
  29. public:
  30. virtual void AmbientPropertyChanged(DISPID dispid);
  31. public:
  32. // do not use COleControlContainer::CreateControl or CWnd::CreateControl !!
  33. // (it's one of these MFC design flaws that none of the CreateControl functions 
  34. // is virtual!)
  35. // Use either this CreateControl function or CWindowlessControl::CreateControl.
  36. virtual BOOL CreateControl(CWnd* pWnd, REFCLSID clsid,
  37. LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, UINT nID,
  38. CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL,
  39. COleControlSite** ppNewSite=NULL);
  40. // call this function from your container windows drawing code
  41. // i.e. OnDraw (CView derived classes) or OnPaint (CWnd derived classes)
  42. virtual void OnDraw(CDC* pDC);
  43. // Implementation
  44. protected:
  45. // we automatically subclasses the container window
  46. WNDPROC m_pfnContWndProc;
  47. static LRESULT CALLBACK ContWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  48. virtual bool OnWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);
  49. virtual COleControlSiteEx* WindowlessSiteFromPoint(CPoint pt);
  50. // strange hack due to a bug in MFC 4.21 import lib (see CPP file)
  51. const AFX_INTERFACEMAP* GetBaseInterfaceMap()
  52. { return COleControlContainer::GetInterfaceMap(); }
  53. BEGIN_INTERFACE_PART(OleInPlaceFrame, IOleInPlaceFrame)
  54. INIT_INTERFACE_PART(COleControlContainer, OleIPFrame)
  55. STDMETHOD(GetWindow)(HWND*);
  56. STDMETHOD(ContextSensitiveHelp)(BOOL);
  57. STDMETHOD(GetBorder)(LPRECT);
  58. STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS);
  59. STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS);
  60. STDMETHOD(SetActiveObject)(LPOLEINPLACEACTIVEOBJECT, LPCOLESTR);
  61. STDMETHOD(InsertMenus)(HMENU, LPOLEMENUGROUPWIDTHS);
  62. STDMETHOD(SetMenu)(HMENU, HOLEMENU, HWND);
  63. STDMETHOD(RemoveMenus)(HMENU);
  64. STDMETHOD(SetStatusText)(LPCOLESTR);
  65. STDMETHOD(EnableModeless)(BOOL);
  66. STDMETHOD(TranslateAccelerator)(LPMSG, WORD);
  67. END_INTERFACE_PART(OleInPlaceFrame)
  68. DECLARE_INTERFACE_MAP()
  69. };
  70. // site class supporting windowless activation
  71. class COleControlSiteEx : public COleControlSite
  72. {
  73. DECLARE_DYNCREATE(COleControlSiteEx);
  74. friend class COccManagerEx;
  75. protected:
  76. COleControlSiteEx();
  77. virtual void Init();
  78. virtual ~COleControlSiteEx();
  79. public:
  80. virtual bool OnWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);
  81. virtual void AmbientPropertyChanged(DISPID dispid);
  82. virtual DWORD GetStyle() const;
  83. virtual DWORD GetExStyle() const;
  84. virtual BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags);
  85. virtual BOOL ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags);
  86. virtual BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y,
  87. int cx, int cy, UINT nFlags);
  88. virtual BOOL ShowWindow(int nCmdShow);
  89. virtual CWnd* SetFocus();
  90. // see comment for COleControlContainerEx::CreateControl
  91. virtual HRESULT CreateControl(CWnd* pWndCtrl, REFCLSID clsid,
  92. LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, UINT nID,
  93. CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL);
  94. // these are overridden only to avoid asserts
  95. #ifdef _DEBUG
  96. virtual void SetWindowText(LPCTSTR lpszString);
  97. virtual void GetWindowText(CString& str) const;
  98. #endif
  99. bool IsWindowlessActive() const
  100. {
  101. return (m_dwActivateFlags & ACTIVATE_WINDOWLESS) != 0;
  102. }
  103. DWORD m_dwActivateFlags;
  104. IOleInPlaceObjectWindowless* m_pIPOW;
  105. virtual void Draw(CDC* pDC);
  106. // Implementation
  107. protected:
  108. // strange hack due to a bug in MFC 4.21 import lib (see CPP file)
  109. const AFX_INTERFACEMAP* GetBaseInterfaceMap()
  110. { return COleControlSite::GetInterfaceMap(); }
  111. BEGIN_INTERFACE_PART(OleInPlaceSiteWindowless, IOleInPlaceSiteWindowless)
  112. // IOleWindow
  113. INIT_INTERFACE_PART(CGOleCtrlSite, OleInPlaceSiteWindowless)
  114. STDMETHOD(GetWindow)(HWND*);
  115. STDMETHOD(ContextSensitiveHelp)(BOOL);
  116. // IOleInPlaceSite
  117. STDMETHOD(CanInPlaceActivate)();
  118. STDMETHOD(OnInPlaceActivate)();
  119. STDMETHOD(OnUIActivate)();
  120. STDMETHOD(GetWindowContext)(LPOLEINPLACEFRAME*,
  121. LPOLEINPLACEUIWINDOW*, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO);
  122. STDMETHOD(Scroll)(SIZE);
  123. STDMETHOD(OnUIDeactivate)(BOOL);
  124. STDMETHOD(OnInPlaceDeactivate)();
  125. STDMETHOD(DiscardUndoState)();
  126. STDMETHOD(DeactivateAndUndo)();
  127. STDMETHOD(OnPosRectChange)(LPCRECT);
  128. // IOleInPlaceSiteEx
  129.         STDMETHOD(OnInPlaceActivateEx)(BOOL* pfNoRedraw, DWORD dwFlags);
  130.         STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);        
  131.         STDMETHOD(RequestUIActivate)();
  132. // IOleInPlaceSiteWindowless
  133.         STDMETHOD(CanWindowlessActivate)();
  134.         STDMETHOD(GetCapture)();
  135.         STDMETHOD(SetCapture)(BOOL fCapture);
  136.         STDMETHOD(GetFocus)();
  137.         STDMETHOD(SetFocus)(BOOL fFocus);
  138.         STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);
  139.         STDMETHOD(ReleaseDC)(HDC hDC);
  140.         STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);
  141.         STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);
  142.         STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
  143.         STDMETHOD(AdjustRect)(LPRECT prc);
  144.         STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);
  145. END_INTERFACE_PART(OleInPlaceSiteWindowless)
  146. DECLARE_INTERFACE_MAP()
  147.     virtual HDC WindowlessGetDC(LPCRECT pRect, DWORD grfFlags);
  148.     virtual void WindowlessReleaseDC(HDC hDC);
  149.     virtual void WindowlessInvalidateRect(LPCRECT pRect, BOOL fErase);
  150.     virtual void WindowlessInvalidateRgn(HRGN hRGN, BOOL fErase);
  151.     virtual void WindowlessScrollRect(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
  152.     virtual void WindowlessAdjustRect(LPRECT prc);
  153.     virtual BOOL WindowlessOnDefWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);
  154. };
  155. // an enhanced OCC manager class. 
  156. // The container and site classes to instantiate are gives as CRuntimeClass objects.
  157. // The default creates COleControlContainerEx and COleControlSiteEx.
  158. class COccManagerEx : public COccManager
  159. {
  160. public:
  161. COccManagerEx(CRuntimeClass* pContainerClass = RUNTIME_CLASS(COleControlContainerEx), 
  162. CRuntimeClass* pSiteClass = RUNTIME_CLASS(COleControlSiteEx));
  163. // Internal object creation
  164. virtual COleControlContainer* CreateContainer(CWnd* pWnd);
  165. virtual COleControlSite* CreateSite(COleControlContainer* pCtrlCont);
  166. CRuntimeClass* m_pContainerClass;
  167. CRuntimeClass* m_pSiteClass;
  168. };
  169. // Useful CWnd replacement for windowless controls.
  170. // Just redefines CreateControl.
  171. class CWindowlessControl : public CWnd
  172. {
  173. DECLARE_DYNCREATE(CWindowlessControl)
  174. public:
  175. CWindowlessControl();
  176. BOOL CreateControl(REFCLSID clsid, LPCTSTR pszWindowName, DWORD dwStyle,
  177. const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist=NULL,
  178. BOOL bStorage=FALSE, BSTR bstrLicKey=NULL);
  179. BOOL CreateControl(LPCTSTR pszClass, LPCTSTR pszWindowName, DWORD dwStyle,
  180. const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist=NULL,
  181. BOOL bStorage=FALSE, BSTR bstrLicKey=NULL);
  182. };
  183. #endif // OccEx.h