TENANT.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:16k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * TENANT.H
  3.  * Patron Chapter 24
  4.  *
  5.  * Definitions and function prototypes for the CTenant class
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13. #ifndef _TENANT_H_
  14. #define _TENANT_H_
  15. class CImpIOleClientSite : public IOleClientSite
  16.     {
  17.     protected:
  18.         ULONG               m_cRef;
  19.         class CTenant      *m_pTen;
  20.         LPUNKNOWN           m_pUnkOuter;
  21.     public:
  22.         CImpIOleClientSite(class CTenant *, LPUNKNOWN);
  23.         ~CImpIOleClientSite(void);
  24.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  25.         STDMETHODIMP_(ULONG) AddRef(void);
  26.         STDMETHODIMP_(ULONG) Release(void);
  27.         STDMETHODIMP SaveObject(void);
  28.         STDMETHODIMP GetMoniker(DWORD, DWORD, LPMONIKER *);
  29.         STDMETHODIMP GetContainer(LPOLECONTAINER *);
  30.         STDMETHODIMP ShowObject(void);
  31.         STDMETHODIMP OnShowWindow(BOOL);
  32.         STDMETHODIMP RequestNewObjectLayout(void);
  33.     };
  34. typedef CImpIOleClientSite *PCImpIOleClientSite;
  35. class CImpIAdviseSink : public IAdviseSink
  36.     {
  37.     protected:
  38.         ULONG               m_cRef;
  39.         class CTenant      *m_pTen;
  40.         LPUNKNOWN           m_pUnkOuter;
  41.     public:
  42.         CImpIAdviseSink(class CTenant *, LPUNKNOWN);
  43.         ~CImpIAdviseSink(void);
  44.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  45.         STDMETHODIMP_(ULONG) AddRef(void);
  46.         STDMETHODIMP_(ULONG) Release(void);
  47.         STDMETHODIMP_(void)  OnDataChange(LPFORMATETC, LPSTGMEDIUM);
  48.         STDMETHODIMP_(void)  OnViewChange(DWORD, LONG);
  49.         STDMETHODIMP_(void)  OnRename(LPMONIKER);
  50.         STDMETHODIMP_(void)  OnSave(void);
  51.         STDMETHODIMP_(void)  OnClose(void);
  52.     };
  53. typedef CImpIAdviseSink *PCImpIAdviseSink;
  54. class CImpIOleInPlaceSite : public IOleInPlaceSite
  55.     {
  56.     protected:
  57.         ULONG               m_cRef;
  58.         class CTenant      *m_pTen;
  59.         LPUNKNOWN           m_pUnkOuter;
  60.     public:
  61.         CImpIOleInPlaceSite(class CTenant *, LPUNKNOWN);
  62.         ~CImpIOleInPlaceSite(void);
  63.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  64.         STDMETHODIMP_(ULONG) AddRef(void);
  65.         STDMETHODIMP_(ULONG) Release(void);
  66.         STDMETHODIMP GetWindow(HWND *);
  67.         STDMETHODIMP ContextSensitiveHelp(BOOL);
  68.         STDMETHODIMP CanInPlaceActivate(void);
  69.         STDMETHODIMP OnInPlaceActivate(void);
  70.         STDMETHODIMP OnUIActivate(void);
  71.         STDMETHODIMP GetWindowContext(LPOLEINPLACEFRAME *
  72.                         , LPOLEINPLACEUIWINDOW *, LPRECT, LPRECT
  73.                         , LPOLEINPLACEFRAMEINFO);
  74.         STDMETHODIMP Scroll(SIZE);
  75.         STDMETHODIMP OnUIDeactivate(BOOL);
  76.         STDMETHODIMP OnInPlaceDeactivate(void);
  77.         STDMETHODIMP DiscardUndoState(void);
  78.         STDMETHODIMP DeactivateAndUndo(void);
  79.         STDMETHODIMP OnPosRectChange(LPCRECT);
  80.     };
  81. typedef CImpIOleInPlaceSite *PCImpIOleInPlaceSite;
  82. //CHAPTER24MOD
  83. class CImpIOleControlSite : public IOleControlSite
  84.     {
  85.     protected:
  86.         ULONG           m_cRef;
  87.         class CTenant  *m_pTen;
  88.         LPUNKNOWN       m_pUnkOuter;
  89.     public:
  90.         CImpIOleControlSite(class CTenant *, LPUNKNOWN);
  91.         ~CImpIOleControlSite(void);
  92.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  93.         STDMETHODIMP_(ULONG) AddRef(void);
  94.         STDMETHODIMP_(ULONG) Release(void);
  95.         STDMETHODIMP OnControlInfoChanged(void);
  96.         STDMETHODIMP LockInPlaceActive(BOOL);
  97.         STDMETHODIMP GetExtendedControl(LPDISPATCH *);
  98.         STDMETHODIMP TransformCoords(POINTL *, POINTF *, DWORD);
  99.         STDMETHODIMP TranslateAccelerator(LPMSG, DWORD);
  100.         STDMETHODIMP OnFocus(BOOL);
  101.         STDMETHODIMP ShowPropertyFrame(void);
  102.     };
  103. typedef class CImpIOleControlSite *PCImpIOleControlSite;
  104. //This IDispatch implements Ambient properties
  105. class CImpIDispatch : public IDispatch
  106.     {
  107.     protected:
  108.         ULONG           m_cRef;
  109.         class CTenant  *m_pTen;
  110.         LPUNKNOWN       m_pUnkOuter;
  111.     public:
  112.         CImpIDispatch(class CTenant *, LPUNKNOWN);
  113.         ~CImpIDispatch(void);
  114.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  115.         STDMETHODIMP_(ULONG) AddRef(void);
  116.         STDMETHODIMP_(ULONG) Release(void);
  117.         STDMETHODIMP GetTypeInfoCount(UINT *);
  118.         STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **);
  119.         STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT
  120.             , LCID, DISPID *);
  121.         STDMETHODIMP Invoke(DISPID, REFIID, LCID, USHORT
  122.             , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
  123.     };
  124. typedef class CImpIDispatch *PCImpIDispatch;
  125. //Events IDispatch created once for each outgoing event set.
  126. class CDispatchEvents : public IDispatch
  127.     {
  128.     protected:
  129.         ULONG           m_cRef;
  130.         class CTenant  *m_pTen;
  131.     public:
  132.         CDispatchEvents(class CTenant *);
  133.         ~CDispatchEvents(void);
  134.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  135.         STDMETHODIMP_(ULONG) AddRef(void);
  136.         STDMETHODIMP_(ULONG) Release(void);
  137.         STDMETHODIMP GetTypeInfoCount(UINT *);
  138.         STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **);
  139.         STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT
  140.             , LCID, DISPID *);
  141.         STDMETHODIMP Invoke(DISPID, REFIID, LCID, USHORT
  142.             , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
  143.     };
  144. typedef class CDispatchEvents *PCDispatchEvents;
  145. //End CHAPTER24MOD
  146. /*
  147.  * Tenant class describing an individual piece of data in a page.
  148.  * It knows where it sits, what object is inside of it, and what
  149.  * its idenitifer is such that it can find it's storage within a
  150.  * page.
  151.  */
  152. //Patron Objects clipboard format
  153. typedef struct tagPATRONOBJECT
  154.     {
  155.     POINTL      ptl;        //Location of object
  156.     POINTL      ptlPick;    //Pick point from drag-drop operation
  157.     SIZEL       szl;        //Extents of object (absolute)
  158.     FORMATETC   fe;         //Actual object format
  159.     } PATRONOBJECT, *PPATRONOBJECT;
  160. //Values for hit-testing, drawing, and resize-tracking tenants
  161. #define CXYHANDLE       5
  162. //Tenant types (not persistent, but determined at load time)
  163. typedef enum
  164.     {
  165.     TENANTTYPE_NULL=0,
  166.     TENANTTYPE_STATIC,
  167.     TENANTTYPE_EMBEDDEDOBJECT,
  168.     TENANTTYPE_EMBEDDEDFILE,
  169.     TENANTTYPE_EMBEDDEDOBJECTFROMDATA,
  170.     TENANTTYPE_LINKEDOBJECT,
  171.     TENANTTYPE_LINKEDFILE,
  172.     TENANTTYPE_LINKEDOBJECTFROMDATA
  173.     } TENANTTYPE, *PTENANTTYPE;
  174. //State flags
  175. //CHAPTER24MOD
  176. //Switched #defines to an enum
  177. enum
  178.     {
  179.     TENANTSTATE_DEFAULT =0x00000000,
  180.     TENANTSTATE_SELECTED=0x00000001,
  181.     TENANTSTATE_OPEN    =0x00000002,
  182.     TENANTSTATE_SHOWTYPE=0x00000004,
  183.     //New ones for controls.
  184.     TENANTSTATE_CONTROL     =0x00000100,
  185.     TENANTSTATE_EVENTS      =0x00000200,
  186.     TENANTSTATE_BUTTON      =0x00000400,
  187.     TENANTSTATE_LABEL       =0x00000800,
  188.     TENANTSTATE_DEFBUTTON   =0x00001000,
  189.     TENANTSTATE_CANCELBUTTON=0x00002000
  190.     };
  191. //To mask off non-control flags
  192. #define STATEMASK_CONTROLS 0xFFFFFF00
  193. //End CHAPTER24MOD
  194. /*
  195.  * Persistent information we need to save for each tenant, which is
  196.  * done in the tenant list instead of with each tenant.  Since this
  197.  * is a small structure it's best not to blow another stream for it
  198.  * (overhead).
  199.  */
  200. typedef struct tagTENANTINFO
  201.     {
  202.     DWORD       dwID;
  203.     RECTL       rcl;
  204.     FORMATETC   fe;             //Excludes ptd
  205.     short       fSetExtent;     //Call IOleObject::SetExtent on Run
  206.     } TENANTINFO, *PTENANTINFO;
  207. //CHAPTER24MOD
  208. /*
  209.  * Event handling constructs:  EVENTACTION is the type of
  210.  * action to execute on an event.  EVENTMAP is an element of
  211.  * an array to hold event mappings.
  212.  */
  213. typedef enum
  214.     {
  215.     ACTION_NONE=-1,
  216.     ACTION_BEEPDEFAULT=MB_OK,
  217.     ACTION_BEEPASTERISK=MB_ICONASTERISK,
  218.     ACTION_BEEPEXCLAMATION=MB_ICONEXCLAMATION,
  219.     ACTION_BEEPHAND=MB_ICONHAND,
  220.     ACTION_BEEPQUESTION=MB_ICONQUESTION,
  221.     ACTION_TAILING=-2
  222.     } EVENTACTION;
  223. typedef struct tagEVENTMAP
  224.     {
  225.     DISPID      id;             //Event ID
  226.     EVENTACTION iAction;        //Action to take
  227.     BSTR        bstrName;       //Event name (function only)
  228.     } EVENTMAP, *PEVENTMAP;
  229. class CEventMap
  230.     {
  231.     public:
  232.         UINT            m_cEvents;
  233.         LPTYPEINFO      m_pITypeInfo;
  234.         PEVENTMAP       m_pEventMap;
  235.     public:
  236.         CEventMap(LPTYPEINFO);
  237.         ~CEventMap(void);
  238.         BOOL            Init(void);
  239.         BOOL            Set(DISPID, EVENTACTION);
  240.         EVENTACTION     Get(DISPID);
  241.         void            Serialize(LPSTREAM);
  242.         void            Deserialize(LPSTREAM);
  243.     };
  244. typedef CEventMap *PCEventMap;
  245. //Events stream in the object storage
  246. #define SZEVENTSSTREAM  OLETEXT("03Event Mappings")
  247. //End CHAPTER24MOD
  248. class CTenant : public IUnknown
  249.     {
  250.     friend CImpIOleClientSite;
  251.     friend CImpIAdviseSink;
  252.     friend CImpIOleInPlaceSite;
  253.     //CHAPTER24MOD
  254.     friend CImpIOleControlSite;
  255.     friend CImpIDispatch;
  256.     friend CDispatchEvents;
  257.     //End CHAPTER24MOD
  258.     private:
  259.         HWND            m_hWnd;         //Pages window
  260.         DWORD           m_dwID;         //Persistent DWORD ID
  261.         DWORD           m_cOpens;       //Count calls to Open
  262.         BOOL            m_fInitialized; //Something here?
  263.         LPUNKNOWN       m_pObj;         //The object here
  264.         LPSTORAGE       m_pIStorage;    //Sub-storage for tenant
  265.         FORMATETC       m_fe;           //Used to create the object
  266.         DWORD           m_dwState;      //State flags
  267.         RECTL           m_rcl;          //Space of this object
  268.         CLSID           m_clsID;        //Object class (for statics)
  269.         BOOL            m_fSetExtent;   //Call SetExtent on next run
  270.         class CPages   *m_pPG;          //Pages window
  271.         TENANTTYPE      m_tType;            //Type identifier
  272.         ULONG           m_cRef;             //We're an object now
  273.         LPOLEOBJECT     m_pIOleObject;      //IOleObject on m_pObj
  274.         LPVIEWOBJECT2   m_pIViewObject2;    //IViewObject2 on m_pObj
  275.         ULONG           m_grfMisc;          //OLEMISC flags
  276.         BOOL            m_fRepaintEnabled;  //No redundant paints
  277.         //Our interfaces
  278.         PCImpIOleClientSite m_pImpIOleClientSite;
  279.         PCImpIAdviseSink    m_pImpIAdviseSink;
  280.         LPMONIKER       m_pmk;          //Relative moniker
  281.         LPMONIKER       m_pmkFile;      //Container document moniker
  282.         PCImpIOleInPlaceSite m_pImpIOleIPSite; //Our interface
  283.         LPOLEINPLACEOBJECT   m_pIOleIPObject;  //The object
  284.         RECT                 m_rcPos;          //Last object rect
  285.         BOOL                 m_fInRectSet;     //Prevent reentrancy
  286.         //CHAPTER24MOD
  287.         PCImpIOleControlSite    m_pImpIOleControlSite; //Implemented
  288.         PCImpIDispatch          m_pImpIDispatch;       //Implemented
  289.         PCDispatchEvents        m_pDispEvents;      //Event Sink
  290.         DWORD                   m_dwConnEvents;
  291.         IID                     m_iidEvents;
  292.         PCEventMap              m_pEventMap;
  293.         //Control interfaces
  294.         LPOLECONTROL        m_pIOleControl;      //Used
  295.         LPDISPATCH          m_pIDispatchControl; //Used
  296.         //Ambient properties
  297.         OLE_COLOR           m_clrBack;
  298.         OLE_COLOR           m_clrFore;
  299.         IFontDisp          *m_pIFont;       //Copy from CPages
  300.         LCID                m_lcid;
  301.         BOOL                m_fDesignMode;
  302.         BOOL                m_fUIDead;
  303.         BOOL                m_fHatchHandles;
  304.         //Other state information
  305.         BOOL                m_fHaveControlInfo;
  306.         CONTROLINFO         m_ctrlInfo;
  307.         ULONG               m_cLockInPlace;
  308.         BOOL                m_fPendingDeactivate;
  309.         //End CHAPTER24MOD
  310.     /*
  311.      * This flag is used exculsively by the implementation of
  312.      * IOleUILinkContainer on the page we're in for the Links
  313.      * Dialog. Since we never use it ourselves, public here
  314.      * is no big deal.
  315.      */
  316.     public:
  317.         BOOL            m_fLinkAvail;
  318.     protected:
  319.         BOOL    ObjectInitialize(LPUNKNOWN, LPFORMATETC, DWORD);
  320.         HRESULT CreateStatic(LPDATAOBJECT, LPFORMATETC
  321.             , LPUNKNOWN *);
  322.         //CHAPTER24MOD
  323.         BOOL    ControlInitialize(void);
  324.         //End CHAPTER24MOD
  325.     public:
  326.         CTenant(DWORD, HWND, CPages *);
  327.         ~CTenant(void);
  328.         //Gotta have an IUnknown for delegation
  329.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  330.         STDMETHODIMP_(ULONG) AddRef(void);
  331.         STDMETHODIMP_(ULONG) Release(void);
  332.         DWORD       GetID(void);
  333.         UINT        GetStorageName(LPOLESTR);
  334.         void        StorageGet(LPSTORAGE *);
  335.         UINT        Create(TENANTTYPE, LPVOID, LPFORMATETC, PPOINTL
  336.                         , LPSIZEL, LPSTORAGE, PPATRONOBJECT, DWORD);
  337.         BOOL        Load(LPSTORAGE, PTENANTINFO);
  338.         void        GetInfo(PTENANTINFO);
  339.         BOOL        Open(LPSTORAGE);
  340.         void        Close(BOOL);
  341.         BOOL        Update(void);
  342.         void        Destroy(LPSTORAGE);
  343.         void        Select(BOOL, BOOL);
  344.         void        ShowAsOpen(BOOL);
  345.         void        ShowYourself(void);
  346.         void        AddVerbMenu(HMENU, UINT);
  347.         TENANTTYPE  TypeGet(void);
  348.         void        CopyEmbeddedObject(LPDATAOBJECT, LPFORMATETC
  349.                         , PPOINTL);
  350.         void        ShowObjectType(BOOL);
  351.         void        CopyLinkedObject(LPDATAOBJECT, LPFORMATETC
  352.                         , PPOINTL);
  353.         void        NotifyOfRename(LPTSTR, LPMONIKER, LPMONIKER);
  354.         BOOL        Activate(LONG, LPMSG);
  355.         void        Draw(HDC, DVTARGETDEVICE *, HDC, int, int
  356.                         , BOOL, BOOL);
  357.         void        Repaint(void);
  358.         void        Invalidate(void);
  359.         void        ObjectClassFormatAndIcon(LPCLSID, LPWORD
  360.                         , LPTSTR *, HGLOBAL *, LPTSTR *);
  361.         BOOL        SwitchOrUpdateAspect(HGLOBAL, BOOL);
  362.         void        EnableRepaint(BOOL);
  363.         BOOL        FIsSelected(void);
  364.         BOOL        ConvertToStatic(void);
  365.         void        ObjectGet(LPUNKNOWN *);
  366.         void        FormatEtcGet(LPFORMATETC, BOOL);
  367.         void        SizeGet(LPSIZEL, BOOL);
  368.         void        SizeSet(LPSIZEL, BOOL, BOOL);
  369.         void        RectGet(LPRECTL, BOOL);
  370.         void        RectSet(LPRECTL, BOOL, BOOL);
  371.         void        DeactivateInPlaceObject(BOOL);
  372.         void        UpdateInPlaceObjectRects(LPCRECT, BOOL);
  373.         HWND        ObjectWindow(void);
  374.         //CHAPTER24MOD
  375.         void        ToggleDesignMode(BOOL);
  376.         void        ToggleUIDead(BOOL);
  377.         void        ToggleHatchHandles(BOOL);
  378.         PCEventMap  EventMap(void);
  379.         DWORD       GetControlFlags();
  380.         BOOL        TryMnemonic(LPMSG);
  381.         void        AmbientChange(DISPID);
  382.         //End CHAPTER24MOD
  383.     };
  384. typedef CTenant *PCTenant;
  385. //Return codes for Create
  386. #define CREATE_FAILED               0
  387. #define CREATE_GRAPHICONLY          1
  388. #define CREATE_PLACEDOBJECT         2
  389. //CHAPTER24MOD
  390. //Helper functions in CONNECT.CPP
  391. BOOL InterfaceConnect(LPUNKNOWN, REFIID, LPUNKNOWN, LPDWORD);
  392. BOOL InterfaceDisconnect(LPUNKNOWN, REFIID, LPDWORD);
  393. BOOL ObjectTypeInfo(LPUNKNOWN, LPTYPEINFO *);
  394. BOOL ObjectTypeInfoEvents(LPUNKNOWN, LPTYPEINFO *);
  395. BOOL ObjectEventsIID(LPUNKNOWN, IID *);
  396. //End CHAPTER24MOD
  397. #endif //_TENANT_H_