home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap24 / polyline / polyline.h < prev    next >
C/C++ Source or Header  |  1995-05-03  |  29KB  |  916 lines

  1. /*
  2.  * POLYLINE.H
  3.  * Polyline Component Chapter 24
  4.  *
  5.  * Definitions and function prototypes
  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.  
  14.  
  15. #ifndef _POLYLINE_H_
  16. #define _POLYLINE_H_
  17.  
  18. #define INC_CLASSLIB
  19. #define INC_CONTROLS
  20. //CHAPTER24MOD
  21. #define GUIDS_FROM_TYPELIB
  22. #define INC_AUTOMATION
  23. #define INC_OLEUI
  24. #define CHAPTER24
  25. //End CHAPTER24MOD
  26. #include <inole.h>
  27. //CHAPTER24MOD
  28. #include "ipoly.h"  //From MKTYPLIB
  29. //Prevent duplicate definition of IPolylineAdviseSink10 in ipoly10.h
  30. #define OMIT_POLYLINESINK
  31. //End CHAPTER24MOD
  32. #include <ipoly10.h>
  33. #include "resource.h"
  34.  
  35.  
  36. //Classname
  37. #define SZCLASSPOLYLINE             TEXT("polyline")
  38.  
  39. //Stream Name that holds the data
  40. #define SZSTREAM                    OLETEXT("CONTENTS")
  41.  
  42. #define SZPOLYFRAMETITLE            TEXT("Polyline Figure in %s")
  43.  
  44. //Magic number to add to aspects returned from IViewObject::Freeze
  45. #define FREEZE_KEY_OFFSET           0x0723
  46.  
  47. #define HIMETRIC_PER_INCH           2540
  48. #define CCHPATHMAX                  256
  49.  
  50. //Window extra bytes and offsets
  51. #define CBPOLYLINEWNDEXTRA          (sizeof(LONG))
  52. #define PLWL_STRUCTURE              0
  53.  
  54. #define ID_HATCHWINDOW              2000
  55.  
  56.  
  57. //DLLPOLY.CPP
  58. int PASCAL LibMain(HINSTANCE, WORD, WORD, LPSTR);
  59.  
  60. //This class factory object creates Polyline objects.
  61.  
  62. class CPolylineClassFactory : public IClassFactory
  63.     {
  64.     protected:
  65.         ULONG           m_cRef;
  66.  
  67.     public:
  68.         CPolylineClassFactory(void);
  69.         ~CPolylineClassFactory(void);
  70.  
  71.         //IUnknown members
  72.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  73.         STDMETHODIMP_(ULONG) AddRef(void);
  74.         STDMETHODIMP_(ULONG) Release(void);
  75.  
  76.         //IClassFactory members
  77.         STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID
  78.                                  , PPVOID);
  79.         STDMETHODIMP         LockServer(BOOL);
  80.     };
  81.  
  82. typedef CPolylineClassFactory *PCPolylineClassFactory;
  83.  
  84.  
  85.  
  86. //POLYWIN.CPP
  87. LRESULT APIENTRY PolylineWndProc(HWND, UINT, WPARAM, LPARAM);
  88.  
  89.  
  90. #ifdef WIN32
  91. #define PROP_POINTER    TEXT("Pointer")
  92. #else
  93. #define PROP_SELECTOR   "Selector"
  94. #define PROP_OFFSET     "Offset"
  95. #endif
  96.  
  97. BOOL APIENTRY PolyDlgProc(HWND, UINT, WPARAM, LPARAM);
  98. void CalcPolyRectInDialog(HWND, LPRECT);
  99.  
  100.  
  101. //Forward class references
  102. class CImpIPolyline;
  103. typedef class CImpIPolyline *PCImpIPolyline;
  104.  
  105. class CImpIConnPtCont;
  106. typedef CImpIConnPtCont *PCImpIConnPtCont;
  107.  
  108. class CConnectionPoint;
  109. typedef CConnectionPoint *PCConnectionPoint;
  110.  
  111. class CImpIPersistStorage;
  112. typedef class CImpIPersistStorage *PCImpIPersistStorage;
  113.  
  114. class CImpIPersistStreamInit;
  115. typedef class CImpIPersistStreamInit *PCImpIPersistStreamInit;
  116.  
  117. class CImpIDataObject;
  118. typedef class CImpIDataObject *PCImpIDataObject;
  119.  
  120. class CImpIOleObject;
  121. typedef class CImpIOleObject *PCImpIOleObject;
  122.  
  123. class CImpIViewObject;
  124. typedef class CImpIViewObject *PCImpIViewObject;
  125.  
  126. class CImpIRunnableObject;
  127. typedef class CImpIRunnableObject *PCImpIRunnableObject;
  128.  
  129. class CImpIExternalConnection;
  130. typedef class CImpIExternalConnection *PCImpIExternalConnection;
  131.  
  132. class CImpIOleInPlaceObject;
  133. typedef class CImpIOleInPlaceObject *PCImpIOleInPlaceObject;
  134.  
  135. class CImpIOleInPlaceActiveObject;
  136. typedef class CImpIOleInPlaceActiveObject *PCImpIOleInPlaceActiveObject;
  137.  
  138.  
  139. //CHAPTER24MOD
  140. class CImpISpecifyPP;
  141. typedef CImpISpecifyPP *PCImpISpecifyPP;
  142.  
  143. class CImpIProvideClassInfo;
  144. typedef CImpIProvideClassInfo *PCImpIProvideClassInfo;
  145.  
  146. class CImpIDispatch;
  147. typedef CImpIDispatch *PCImpIDispatch;
  148.  
  149. class CImpIPolylineControl;
  150. typedef CImpIPolylineControl *PCImpIPolylineControl;
  151.  
  152. class CImpIOleControl;
  153. typedef CImpIOleControl *PCImpIOleControl;
  154.  
  155. class CAdviseRouter;
  156. typedef CAdviseRouter *PCAdviseRouter;
  157. //End CHAPTER24MOD
  158.  
  159.  
  160. //POLYLINE.CPP
  161. class CPolyline : public IUnknown
  162.     {
  163.     friend LRESULT APIENTRY PolylineWndProc(HWND, UINT, WPARAM
  164.         , LPARAM);
  165.  
  166.     friend class CImpIPolyline;
  167.     friend class CImpIConnPtCont;
  168.     friend class CConnectionPoint;
  169.     friend class CImpIPersistStorage;
  170.     friend class CImpIPersistStreamInit;
  171.     friend class CImpIDataObject;
  172.  
  173.     friend BOOL APIENTRY PolyDlgProc(HWND, UINT, WPARAM, LPARAM);
  174.     friend class CImpIOleObject;
  175.     friend class CImpIViewObject;
  176.     friend class CImpIRunnableObject;
  177.     friend class CImpIExternalConnection;
  178.     friend class CImpIOleInPlaceObject;
  179.     friend class CImpIOleInPlaceActiveObject;
  180.  
  181.     //CHAPTER24MOD
  182.     friend class CImpISpecifyPP;
  183.     friend class CImpIProvideClassInfo;
  184.     friend class CImpIDispatch;
  185.     friend class CImpIPolylineControl;
  186.     friend class CImpIOleControl;
  187.  
  188.     friend class CAdviseRouter;
  189.     //End CHAPTER24MOD
  190.  
  191.     protected:
  192.         HWND            m_hWnd;
  193.         HINSTANCE       m_hInst;
  194.  
  195.         ULONG           m_cRef;         //Object reference count
  196.         LPUNKNOWN       m_pUnkOuter;    //Controlling Unknown
  197.         PFNDESTROYED    m_pfnDestroy;   //Function called on closure
  198.         BOOL            m_fDirty;       //Have we changed?
  199.         POLYLINEDATA    m_pl;           //Our actual data
  200.  
  201.         //Contained interfaces
  202.         PCImpIPolyline          m_pImpIPolyline;
  203.         PCImpIConnPtCont        m_pImpIConnPtCont;
  204.         PCImpIPersistStorage    m_pImpIPersistStorage;
  205.         PCImpIPersistStreamInit m_pImpIPersistStreamInit;
  206.         PCImpIDataObject        m_pImpIDataObject;
  207.  
  208.         /*
  209.          * Connected sink:  only one per object.  We get this
  210.          * through our connection point.
  211.          */
  212.         IPolylineAdviseSink10  *m_pAdv;
  213.         PCConnectionPoint       m_pConnPt;
  214.  
  215.         PCStringTable   m_pST;          //Object strings
  216.         UINT            m_cf;           //Object clipboard format
  217.         CLSID           m_clsID;        //Current CLSID
  218.  
  219.         //We have to hold these for IPersistStorage::Save
  220.         LPSTORAGE       m_pIStorage;
  221.         LPSTREAM        m_pIStream;
  222.  
  223.         LPDATAADVISEHOLDER  m_pIDataAdviseHolder;
  224.  
  225.         //These are default handler interfaces we use
  226.         LPUNKNOWN           m_pDefIUnknown;
  227.         LPVIEWOBJECT2       m_pDefIViewObject;
  228.         LPPERSISTSTORAGE    m_pDefIPersistStorage;
  229.         LPDATAOBJECT        m_pDefIDataObject;
  230.  
  231.         //Implemented and used interfaces
  232.         PCImpIOleObject     m_pImpIOleObject;       //Implemented
  233.         LPOLEADVISEHOLDER   m_pIOleAdviseHolder;    //Used
  234.  
  235.         LPOLECLIENTSITE     m_pIOleClientSite;      //Used
  236.  
  237.         PCImpIViewObject    m_pImpIViewObject;      //Implemented
  238.         LPADVISESINK        m_pIAdviseSink;         //Used
  239.         DWORD               m_dwFrozenAspects;      //Freeze
  240.         DWORD               m_dwAdviseAspects;      //SetAdvise
  241.         DWORD               m_dwAdviseFlags;        //SetAdvise
  242.  
  243.         POLYLINEDATA        m_plContent;            //For freezing
  244.         POLYLINEDATA        m_plThumbnail;          //For freezing
  245.  
  246.         PCImpIRunnableObject m_pImpIRunnableObject; //Implemented
  247.         HWND                m_hDlg;                 //Editing window
  248.  
  249.         PCImpIExternalConnection m_pImpIExternalConnection; //Implemented
  250.         BOOL                     m_fLockContainer;
  251.         DWORD                    m_dwRegROT;
  252.  
  253.  
  254.         LPOLEINPLACESITE            m_pIOleIPSite;
  255.         LPOLEINPLACEFRAME           m_pIOleIPFrame;
  256.         LPOLEINPLACEUIWINDOW        m_pIOleIPUIWindow;
  257.  
  258.         PCImpIOleInPlaceObject       m_pImpIOleIPObject;
  259.         PCImpIOleInPlaceActiveObject m_pImpIOleIPActiveObject;
  260.  
  261.         HMENU                       m_hMenuShared;
  262.         HOLEMENU                    m_hOLEMenu;
  263.  
  264.         PCHatchWin                  m_pHW;
  265.         BOOL                        m_fAllowInPlace;
  266.         BOOL                        m_fUIActive;
  267.         BOOL                        m_fContainerKnowsInsideOut;
  268.  
  269.         //CHAPTER24MOD
  270.         PCImpISpecifyPP             m_pImpISpecifyPP;
  271.         PCImpIProvideClassInfo      m_pImpIProvideClassInfo;
  272.         PCImpIDispatch              m_pImpIDispatch;
  273.         PCImpIPolylineControl       m_pImpIPolylineControl;
  274.         PCImpIOleControl            m_pImpIOleControl;
  275.  
  276.         //Our own type lib for the object
  277.         ITypeLib                   *m_pITypeLib;
  278.  
  279.         //From the container;
  280.         IOleControlSite            *m_pIOleControlSite;
  281.         IDispatch                  *m_pIDispatchAmbients;
  282.         BOOL                        m_fFreezeEvents;
  283.         CONTROLINFO                 m_ctrlInfo;
  284.  
  285.         //Other ambients
  286.         BOOL                        m_fHatch;
  287.         BOOL                        m_fUIDead;
  288.         //End CHAPTER24MOD
  289.  
  290.     protected:
  291.         void      PointScale(LPRECT, LPPOINTS, BOOL);
  292.         void      Draw(HDC, BOOL, BOOL, LPRECT, PPOLYLINEDATA);
  293.         HINSTANCE Instance(void);
  294.         LPTSTR    String(UINT);
  295.         void      SendAdvise(UINT);
  296.         void      RectConvertMappings(LPRECT, BOOL);
  297.  
  298.         /*
  299.          * These members pulled from IPolyline now serve as a
  300.          * central store for this functionality to be used from
  301.          * other interfaces like IPersistStorage and IDataObject.
  302.          * Other interfaces later may also use them.
  303.          */
  304.         STDMETHODIMP DataSet(PPOLYLINEDATA, BOOL, BOOL);
  305.         STDMETHODIMP DataGet(PPOLYLINEDATA);
  306.  
  307.         STDMETHODIMP RenderNative(HGLOBAL *);
  308.         STDMETHODIMP RenderBitmap(HBITMAP *);
  309.         STDMETHODIMP RenderMetafilePict(HGLOBAL *);
  310.  
  311.  
  312.     public:
  313.         CPolyline(LPUNKNOWN, PFNDESTROYED, HINSTANCE);
  314.         ~CPolyline(void);
  315.  
  316.         BOOL      Init(void);
  317.  
  318.         //Non-delegating object IUnknown
  319.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  320.         STDMETHODIMP_(ULONG) AddRef(void);
  321.         STDMETHODIMP_(ULONG) Release(void);
  322.  
  323.         HRESULT  InPlaceActivate(LPOLECLIENTSITE, BOOL);
  324.         void     InPlaceDeactivate(void);
  325.         HRESULT  UIActivate(void);
  326.         void     UIDeactivate(void);
  327.  
  328.         //CHAPTER24MOD
  329.         BOOL     AmbientGet(DISPID, VARIANT *);
  330.         void     AmbientsInitialize(DWORD);
  331.         //End CHAPTER24MOD
  332.     };
  333.  
  334. typedef CPolyline *PCPolyline;
  335.  
  336.  
  337. //Codes for CPolyline::SendAdvise
  338. //......Code.....................Method called in CPolyline::SendAdvise
  339. #define OBJECTCODE_SAVED       0 //IOleAdviseHolder::SendOnSave
  340. #define OBJECTCODE_CLOSED      1 //IOleAdviseHolder::SendOnClose
  341. #define OBJECTCODE_RENAMED     2 //IOleAdviseHolder::SendOnRename
  342. #define OBJECTCODE_SAVEOBJECT  3 //IOleClientSite::SaveObject
  343. #define OBJECTCODE_DATACHANGED 4 //IDataAdviseHolder::SendOnDataChange
  344. #define OBJECTCODE_SHOWWINDOW  5 //IOleClientSite::OnShowWindow(TRUE)
  345. #define OBJECTCODE_HIDEWINDOW  6 //IOleClientSite::OnShowWindow(FALSE)
  346. #define OBJECTCODE_SHOWOBJECT  7 //IOleClientSite::ShowObject
  347.  
  348.  
  349. //CHAPTER24MOD
  350. //Flags for AmbientsInitialize
  351. enum
  352.     {
  353.     INITAMBIENT_SHOWHATCHING = 0x00000001,
  354.     INITAMBIENT_UIDEAD       = 0x00000002,
  355.     INITAMBIENT_BACKCOLOR    = 0x00000004,
  356.     INITAMBIENT_FORECOLOR    = 0x00000008,
  357.     INITAMBIENT_ALL          = 0xFFFFFFFF
  358.     };
  359. //End CHAPTER24MOD
  360.  
  361. //Interface implementation contained in the Polyline.
  362.  
  363. class CImpIPolyline : public IPolyline10
  364.     {
  365.     protected:
  366.         ULONG               m_cRef;      //Interface reference count
  367.         PCPolyline          m_pObj;      //Back pointer to object
  368.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  369.  
  370.     public:
  371.         CImpIPolyline(PCPolyline, LPUNKNOWN);
  372.         ~CImpIPolyline(void);
  373.  
  374.         //IUnknown members.
  375.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  376.         STDMETHODIMP_(ULONG) AddRef(void);
  377.         STDMETHODIMP_(ULONG) Release(void);
  378.  
  379.         //Manipulation members:
  380.         STDMETHODIMP Init(HWND, LPRECT, DWORD, UINT);
  381.         STDMETHODIMP New(void);
  382.         STDMETHODIMP Undo(void);
  383.         STDMETHODIMP Window(HWND *);
  384.  
  385.         STDMETHODIMP RectGet(LPRECT);
  386.         STDMETHODIMP SizeGet(LPRECT);
  387.         STDMETHODIMP RectSet(LPRECT, BOOL);
  388.         STDMETHODIMP SizeSet(LPRECT, BOOL);
  389.  
  390.         STDMETHODIMP ColorSet(UINT, COLORREF, COLORREF *);
  391.         STDMETHODIMP ColorGet(UINT, COLORREF *);
  392.  
  393.         STDMETHODIMP LineStyleSet(UINT, UINT *);
  394.         STDMETHODIMP LineStyleGet(UINT *);
  395.     };
  396.  
  397.  
  398. class CImpIConnPtCont : public IConnectionPointContainer
  399.     {
  400.     private:
  401.         ULONG               m_cRef;      //Interface ref count
  402.         PCPolyline          m_pObj;      //Back pointer to object
  403.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  404.  
  405.     public:
  406.         CImpIConnPtCont(PCPolyline, LPUNKNOWN);
  407.         ~CImpIConnPtCont(void);
  408.  
  409.         //IUnknown members
  410.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  411.         STDMETHODIMP_(DWORD) AddRef(void);
  412.         STDMETHODIMP_(DWORD) Release(void);
  413.  
  414.         //IConnectionPointContainer members
  415.         STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints **);
  416.         STDMETHODIMP FindConnectionPoint(REFIID, IConnectionPoint **);
  417.     };
  418.  
  419.  
  420. /*
  421.  * This connection point will only allow one connection,
  422.  * so it always returns the same connection key.  It also
  423.  * doesn't bother to implement enumerations.
  424.  */
  425.  
  426. #define CCONNMAX    1
  427. #define ADVISEKEY   72388       //Arbitrary
  428.  
  429. class CConnectionPoint : public IConnectionPoint
  430.     {
  431.     private:
  432.         ULONG           m_cRef;     //Object reference count
  433.         PCPolyline      m_pObj;     //Containing object.
  434.         //CHAPTER24MOD
  435.         IID             m_iid;      //Outgoing interface
  436.         //End CHAPTER24MOD
  437.  
  438.     public:
  439.         CConnectionPoint(PCPolyline);
  440.         ~CConnectionPoint(void);
  441.  
  442.         //CHAPTER24MOD
  443.         void SetIID(REFIID);
  444.         //End CHAPTER24MOD
  445.  
  446.         //IUnknown members
  447.         STDMETHODIMP         QueryInterface(REFIID, LPVOID *);
  448.         STDMETHODIMP_(ULONG) AddRef(void);
  449.         STDMETHODIMP_(ULONG) Release(void);
  450.  
  451.         //IConnectionPoint members
  452.         STDMETHODIMP GetConnectionInterface(IID *);
  453.         STDMETHODIMP GetConnectionPointContainer
  454.             (IConnectionPointContainer **);
  455.         STDMETHODIMP Advise(LPUNKNOWN, DWORD *);
  456.         STDMETHODIMP Unadvise(DWORD);
  457.         STDMETHODIMP EnumConnections(IEnumConnections **);
  458.     };
  459.  
  460.  
  461.  
  462. class CImpIPersistStorage : public IPersistStorage
  463.     {
  464.     protected:
  465.         ULONG               m_cRef;      //Interface reference count
  466.         PCPolyline          m_pObj;      //Back pointer to object
  467.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  468.         PSSTATE             m_psState;   //Storage state
  469.  
  470.     public:
  471.         CImpIPersistStorage(PCPolyline, LPUNKNOWN);
  472.         ~CImpIPersistStorage(void);
  473.  
  474.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  475.         STDMETHODIMP_(ULONG) AddRef(void);
  476.         STDMETHODIMP_(ULONG) Release(void);
  477.  
  478.         STDMETHODIMP GetClassID(LPCLSID);
  479.  
  480.         STDMETHODIMP IsDirty(void);
  481.         STDMETHODIMP InitNew(LPSTORAGE);
  482.         STDMETHODIMP Load(LPSTORAGE);
  483.         STDMETHODIMP Save(LPSTORAGE, BOOL);
  484.         STDMETHODIMP SaveCompleted(LPSTORAGE);
  485.         STDMETHODIMP HandsOffStorage(void);
  486.     };
  487.  
  488.  
  489. class CImpIPersistStreamInit : public IPersistStreamInit
  490.     {
  491.     protected:
  492.         ULONG               m_cRef;      //Interface reference count
  493.         PCPolyline          m_pObj;      //Back pointer to object
  494.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  495.  
  496.     public:
  497.         CImpIPersistStreamInit(PCPolyline, LPUNKNOWN);
  498.         ~CImpIPersistStreamInit(void);
  499.  
  500.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  501.         STDMETHODIMP_(ULONG) AddRef(void);
  502.         STDMETHODIMP_(ULONG) Release(void);
  503.  
  504.         STDMETHODIMP GetClassID(LPCLSID);
  505.  
  506.         STDMETHODIMP IsDirty(void);
  507.         STDMETHODIMP Load(LPSTREAM);
  508.         STDMETHODIMP Save(LPSTREAM, BOOL);
  509.         STDMETHODIMP GetSizeMax(ULARGE_INTEGER *);
  510.         STDMETHODIMP InitNew(void);
  511.     };
  512.  
  513.  
  514. //IDATAOBJ.CPP
  515. class CImpIDataObject : public IDataObject
  516.     {
  517.     private:
  518.         ULONG               m_cRef;      //Interface reference count
  519.         PCPolyline          m_pObj;      //Back pointer to object
  520.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  521.  
  522.     public:
  523.         CImpIDataObject(PCPolyline, LPUNKNOWN);
  524.         ~CImpIDataObject(void);
  525.  
  526.         //IUnknown members that delegate to m_pUnkOuter.
  527.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  528.         STDMETHODIMP_(ULONG) AddRef(void);
  529.         STDMETHODIMP_(ULONG) Release(void);
  530.  
  531.         //IDataObject members
  532.         STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
  533.         STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
  534.         STDMETHODIMP QueryGetData(LPFORMATETC);
  535.         STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC);
  536.         STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL);
  537.         STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *);
  538.         STDMETHODIMP DAdvise(LPFORMATETC, DWORD, LPADVISESINK
  539.             , DWORD *);
  540.         STDMETHODIMP DUnadvise(DWORD);
  541.         STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *);
  542.     };
  543.  
  544.  
  545.  
  546. //IENUMFE.CPP
  547. class CEnumFormatEtc : public IEnumFORMATETC
  548.     {
  549.     private:
  550.         ULONG           m_cRef;
  551.         LPUNKNOWN       m_pUnkRef;
  552.         ULONG           m_iCur;
  553.         ULONG           m_cfe;
  554.         LPFORMATETC     m_prgfe;
  555.  
  556.     public:
  557.         CEnumFormatEtc(LPUNKNOWN, ULONG, LPFORMATETC);
  558.         ~CEnumFormatEtc(void);
  559.  
  560.         //IUnknown members that delegate to m_pUnkRef.
  561.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  562.         STDMETHODIMP_(ULONG) AddRef(void);
  563.         STDMETHODIMP_(ULONG) Release(void);
  564.  
  565.         //IEnumFORMATETC members
  566.         STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG *);
  567.         STDMETHODIMP Skip(ULONG);
  568.         STDMETHODIMP Reset(void);
  569.         STDMETHODIMP Clone(IEnumFORMATETC **);
  570.     };
  571.  
  572.  
  573. typedef CEnumFormatEtc *PCEnumFormatEtc;
  574.  
  575.  
  576. //CHAPTER24MOD
  577. //Our own properties verb
  578. #define POLYLINEVERB_PROPERTIES     1
  579. //End CHAPTER24MOD
  580.  
  581.  
  582. class CImpIOleObject : public IOleObject
  583.     {
  584.     private:
  585.         ULONG           m_cRef;
  586.         PCPolyline      m_pObj;
  587.         LPUNKNOWN       m_pUnkOuter;
  588.  
  589.     public:
  590.         CImpIOleObject(PCPolyline, LPUNKNOWN);
  591.         ~CImpIOleObject(void);
  592.  
  593.         //IUnknown members that delegate to m_pUnkOuter.
  594.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  595.         STDMETHODIMP_(ULONG) AddRef(void);
  596.         STDMETHODIMP_(ULONG) Release(void);
  597.  
  598.         //IOleObject members
  599.         STDMETHODIMP SetClientSite(LPOLECLIENTSITE);
  600.         STDMETHODIMP GetClientSite(LPOLECLIENTSITE *);
  601.         STDMETHODIMP SetHostNames(LPCOLESTR, LPCOLESTR);
  602.         STDMETHODIMP Close(DWORD);
  603.         STDMETHODIMP SetMoniker(DWORD, LPMONIKER);
  604.         STDMETHODIMP GetMoniker(DWORD, DWORD, LPMONIKER *);
  605.         STDMETHODIMP InitFromData(LPDATAOBJECT, BOOL, DWORD);
  606.         STDMETHODIMP GetClipboardData(DWORD, LPDATAOBJECT *);
  607.         STDMETHODIMP DoVerb(LONG, LPMSG, LPOLECLIENTSITE, LONG
  608.                          , HWND, LPCRECT);
  609.         STDMETHODIMP EnumVerbs(LPENUMOLEVERB *);
  610.         STDMETHODIMP Update(void);
  611.         STDMETHODIMP IsUpToDate(void);
  612.         STDMETHODIMP GetUserClassID(CLSID *);
  613.         STDMETHODIMP GetUserType(DWORD, LPOLESTR *);
  614.         STDMETHODIMP SetExtent(DWORD, LPSIZEL);
  615.         STDMETHODIMP GetExtent(DWORD, LPSIZEL);
  616.         STDMETHODIMP Advise(LPADVISESINK, DWORD *);
  617.         STDMETHODIMP Unadvise(DWORD);
  618.         STDMETHODIMP EnumAdvise(LPENUMSTATDATA *);
  619.         STDMETHODIMP GetMiscStatus(DWORD, DWORD *);
  620.         STDMETHODIMP SetColorScheme(LPLOGPALETTE);
  621.     };
  622.  
  623.  
  624. //IVIEWOBJ.CPP
  625. class CImpIViewObject : public IViewObject2
  626.     {
  627.     private:
  628.         ULONG           m_cRef;
  629.         PCPolyline      m_pObj;
  630.         LPUNKNOWN       m_pUnkOuter;
  631.  
  632.     public:
  633.         CImpIViewObject(PCPolyline, LPUNKNOWN);
  634.         ~CImpIViewObject(void);
  635.  
  636.         //IUnknown members that delegate to m_pUnkOuter.
  637.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  638.         STDMETHODIMP_(ULONG) AddRef(void);
  639.         STDMETHODIMP_(ULONG) Release(void);
  640.  
  641.         //IViewObject members
  642.         STDMETHODIMP Draw(DWORD, LONG, LPVOID
  643.             , DVTARGETDEVICE *, HDC, HDC, LPCRECTL
  644.             , LPCRECTL, BOOL (CALLBACK *)(DWORD), DWORD);
  645.         STDMETHODIMP GetColorSet(DWORD, LONG, LPVOID
  646.             , DVTARGETDEVICE *, HDC, LPLOGPALETTE *);
  647.         STDMETHODIMP Freeze(DWORD, LONG, LPVOID, LPDWORD);
  648.         STDMETHODIMP Unfreeze(DWORD);
  649.         STDMETHODIMP SetAdvise(DWORD, DWORD, LPADVISESINK);
  650.         STDMETHODIMP GetAdvise(LPDWORD, LPDWORD, LPADVISESINK *);
  651.         STDMETHODIMP GetExtent(DWORD, LONG, DVTARGETDEVICE *
  652.             , LPSIZEL);
  653.     };
  654.  
  655.  
  656. class CImpIRunnableObject : public IRunnableObject
  657.     {
  658.     protected:
  659.         ULONG           m_cRef;
  660.         PCPolyline      m_pObj;
  661.         LPUNKNOWN       m_pUnkOuter;
  662.  
  663.     public:
  664.         CImpIRunnableObject(PCPolyline, LPUNKNOWN);
  665.         ~CImpIRunnableObject(void);
  666.  
  667.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  668.         STDMETHODIMP_(ULONG) AddRef(void);
  669.         STDMETHODIMP_(ULONG) Release(void);
  670.  
  671.         STDMETHODIMP GetRunningClass(LPCLSID);
  672.         STDMETHODIMP Run(LPBINDCTX);
  673.         STDMETHODIMP_(BOOL) IsRunning(void);
  674.         STDMETHODIMP LockRunning(BOOL, BOOL);
  675.         STDMETHODIMP SetContainedObject(BOOL);
  676.     };
  677.  
  678.  
  679. class CImpIExternalConnection : public IExternalConnection
  680.     {
  681.     protected:
  682.         ULONG           m_cRef;
  683.         PCPolyline      m_pObj;
  684.         LPUNKNOWN       m_pUnkOuter;
  685.         DWORD           m_cLockStrong;
  686.  
  687.     public:
  688.         CImpIExternalConnection(PCPolyline, LPUNKNOWN);
  689.         ~CImpIExternalConnection(void);
  690.  
  691.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  692.         STDMETHODIMP_(ULONG) AddRef(void);
  693.         STDMETHODIMP_(ULONG) Release(void);
  694.  
  695.         STDMETHODIMP_(DWORD) AddConnection(DWORD, DWORD);
  696.         STDMETHODIMP_(DWORD) ReleaseConnection(DWORD, DWORD, BOOL);
  697.     };
  698.  
  699.  
  700.  
  701. class CImpIOleInPlaceObject : public IOleInPlaceObject
  702.     {
  703.     protected:
  704.         ULONG               m_cRef;
  705.         PCPolyline          m_pObj;
  706.         LPUNKNOWN           m_pUnkOuter;
  707.  
  708.     public:
  709.         CImpIOleInPlaceObject(PCPolyline, LPUNKNOWN);
  710.         ~CImpIOleInPlaceObject(void);
  711.  
  712.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  713.         STDMETHODIMP_(ULONG) AddRef(void);
  714.         STDMETHODIMP_(ULONG) Release(void);
  715.  
  716.         STDMETHODIMP GetWindow(HWND *);
  717.         STDMETHODIMP ContextSensitiveHelp(BOOL);
  718.         STDMETHODIMP InPlaceDeactivate(void);
  719.         STDMETHODIMP UIDeactivate(void);
  720.         STDMETHODIMP SetObjectRects(LPCRECT, LPCRECT);
  721.         STDMETHODIMP ReactivateAndUndo(void);
  722.     };
  723.  
  724.  
  725.  
  726. class CImpIOleInPlaceActiveObject
  727.     : public IOleInPlaceActiveObject
  728.     {
  729.     protected:
  730.         ULONG               m_cRef;
  731.         PCPolyline          m_pObj;
  732.         LPUNKNOWN           m_pUnkOuter;
  733.  
  734.     public:
  735.         CImpIOleInPlaceActiveObject(PCPolyline, LPUNKNOWN);
  736.         ~CImpIOleInPlaceActiveObject(void);
  737.  
  738.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  739.         STDMETHODIMP_(ULONG) AddRef(void);
  740.         STDMETHODIMP_(ULONG) Release(void);
  741.  
  742.         STDMETHODIMP GetWindow(HWND *);
  743.         STDMETHODIMP ContextSensitiveHelp(BOOL);
  744.         STDMETHODIMP TranslateAccelerator(LPMSG);
  745.         STDMETHODIMP OnFrameWindowActivate(BOOL);
  746.         STDMETHODIMP OnDocWindowActivate(BOOL);
  747.         STDMETHODIMP ResizeBorder(LPCRECT, LPOLEINPLACEUIWINDOW
  748.                          , BOOL);
  749.         STDMETHODIMP EnableModeless(BOOL);
  750.     };
  751.  
  752.  
  753. //CHAPTER24MOD
  754.  
  755. #define CPROPPAGES   1   //Total property page count.
  756.  
  757. class CImpISpecifyPP : public ISpecifyPropertyPages
  758.     {
  759.     protected:
  760.         ULONG           m_cRef;      //Interface reference count
  761.         PCPolyline      m_pObj;      //Backpointer to the object
  762.         LPUNKNOWN       m_pUnkOuter; //For delegation
  763.  
  764.     public:
  765.         CImpISpecifyPP(PCPolyline, LPUNKNOWN);
  766.         ~CImpISpecifyPP(void);
  767.  
  768.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  769.         STDMETHODIMP_(ULONG) AddRef(void);
  770.         STDMETHODIMP_(ULONG) Release(void);
  771.  
  772.         STDMETHODIMP GetPages(CAUUID *);
  773.     };
  774.  
  775.  
  776.  
  777. class CImpIProvideClassInfo : public IProvideClassInfo
  778.     {
  779.     protected:
  780.         ULONG           m_cRef;      //Interface reference count
  781.         PCPolyline      m_pObj;      //Backpointer to the object
  782.         LPUNKNOWN       m_pUnkOuter; //For delegation
  783.  
  784.     public:
  785.         CImpIProvideClassInfo(PCPolyline, LPUNKNOWN);
  786.         ~CImpIProvideClassInfo(void);
  787.  
  788.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  789.         STDMETHODIMP_(ULONG) AddRef(void);
  790.         STDMETHODIMP_(ULONG) Release(void);
  791.  
  792.         STDMETHODIMP GetClassInfo(LPTYPEINFO *);
  793.     };
  794.  
  795.  
  796.  
  797. class CImpIDispatch : public IDispatch
  798.     {
  799.     public:
  800.  
  801.     private:
  802.         ULONG           m_cRef;     //For debugging
  803.         PCPolyline      m_pObj;
  804.         LPUNKNOWN       m_pUnkOuter;
  805.  
  806.         ITypeInfo      *m_pITI;     //Type information
  807.  
  808.     public:
  809.         CImpIDispatch(PCPolyline, LPUNKNOWN);
  810.         ~CImpIDispatch(void);
  811.  
  812.         //IUnknown members that delegate to m_pUnkOuter.
  813.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  814.         STDMETHODIMP_(ULONG) AddRef(void);
  815.         STDMETHODIMP_(ULONG) Release(void);
  816.  
  817.         //IDispatch members
  818.         STDMETHODIMP GetTypeInfoCount(UINT *);
  819.         STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **);
  820.         STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID
  821.             , DISPID *);
  822.         STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD
  823.             , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
  824.     };
  825.  
  826.  
  827. class CImpIPolylineControl : public IPolylineControl
  828.     {
  829.     protected:
  830.         ULONG               m_cRef;      //Interface reference count
  831.         PCPolyline          m_pObj;      //Back pointer to object
  832.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  833.  
  834.     public:
  835.         CImpIPolylineControl(PCPolyline, LPUNKNOWN);
  836.         ~CImpIPolylineControl(void);
  837.  
  838.         //IUnknown members.
  839.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  840.         STDMETHODIMP_(ULONG) AddRef(void);
  841.         STDMETHODIMP_(ULONG) Release(void);
  842.  
  843.         //Manipulation members:
  844.         STDMETHODIMP_(void)      put_BackColor(OLE_COLOR);
  845.         STDMETHODIMP_(OLE_COLOR) get_BackColor(void);
  846.         STDMETHODIMP_(void)      put_LineColor(OLE_COLOR);
  847.         STDMETHODIMP_(OLE_COLOR) get_LineColor(void);
  848.         STDMETHODIMP_(void)      put_LineStyle(short);
  849.         STDMETHODIMP_(short)     get_LineStyle(void);
  850.         STDMETHODIMP             Clear(void);
  851.         STDMETHODIMP             RemoveLastPoint(void);
  852.     };
  853.  
  854.  
  855. class CImpIOleControl : public IOleControl
  856.     {
  857.     protected:
  858.         ULONG           m_cRef;      //Interface reference count
  859.         PCPolyline      m_pObj;      //Backpointer to the object
  860.         LPUNKNOWN       m_pUnkOuter; //For delegation
  861.  
  862.     public:
  863.         CImpIOleControl(PCPolyline, LPUNKNOWN);
  864.         ~CImpIOleControl(void);
  865.  
  866.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  867.         STDMETHODIMP_(ULONG) AddRef(void);
  868.         STDMETHODIMP_(ULONG) Release(void);
  869.  
  870.         STDMETHODIMP GetControlInfo(LPCONTROLINFO);
  871.         STDMETHODIMP OnMnemonic(LPMSG);
  872.         STDMETHODIMP OnAmbientPropertyChange(DISPID);
  873.         STDMETHODIMP FreezeEvents(BOOL);
  874.     };
  875.  
  876.  
  877.  
  878. class CAdviseRouter : public IPolylineAdviseSink10
  879.     {
  880.     private:
  881.         ULONG       m_cRef;
  882.         PCPolyline  m_pObj;
  883.         IDispatch  *m_pIDispatch;
  884.  
  885.     public:
  886.         CAdviseRouter(IDispatch *, PCPolyline);
  887.         ~CAdviseRouter(void);
  888.  
  889.         void Invoke(DISPID);
  890.  
  891.         //IUnknown members
  892.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  893.         STDMETHODIMP_(ULONG) AddRef(void);
  894.         STDMETHODIMP_(ULONG) Release(void);
  895.  
  896.         //Advise members.
  897.         STDMETHODIMP_(void) OnPointChange(void);
  898.         STDMETHODIMP_(void) OnSizeChange(void);
  899.         STDMETHODIMP_(void) OnColorChange(void);
  900.         STDMETHODIMP_(void) OnLineStyleChange(void);
  901.     };
  902.  
  903. //These values match the ID's in polyline.odl
  904. enum
  905.     {
  906.     EVENT_ONPOINTCHANGE=0,
  907.     EVENT_ONSIZECHANGE=1,
  908.     EVENT_ONCOLORCHANGE=2,
  909.     EVENT_ONLINESTYLECHANGE=3
  910.     };
  911.  
  912. //End CHAPTER24MOD
  913.  
  914.  
  915. #endif  //_POLYLINE_H_
  916.