POLYLINE.H
/* 
 * POLYLINE.H 
 * Polyline Component Chapter 10 
 * 
 * Definitions and function prototypes 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#ifndef _POLYLINE_H_ 
#define _POLYLINE_H_ 
 
#define INC_CLASSLIB 
#define INC_CONTROLS 
//CHAPTER10MOD 
#define CHAPTER10 
#include <inole.h> 
#include <ipoly10.h> 
#include "resource.h" 
//End CHAPTER10MOD 
 
 
//Classname 
#define SZCLASSPOLYLINE             TEXT("polyline") 
 
//Stream Name that holds the data 
#define SZSTREAM                    OLETEXT("CONTENTS") 
 
 
#define HIMETRIC_PER_INCH           2540 
#define CCHPATHMAX                  256 
 
//Window extra bytes and offsets 
#define CBPOLYLINEWNDEXTRA          (sizeof(LONG)) 
#define PLWL_STRUCTURE              0 
 
 
//DLLPOLY.CPP 
int PASCAL LibMain(HINSTANCE, WORD, WORD, LPSTR); 
 
//This class factory object creates Polyline objects. 
 
class CPolylineClassFactory : public IClassFactory 
    { 
    protected: 
        ULONG           m_cRef; 
 
    public: 
        CPolylineClassFactory(void); 
        ~CPolylineClassFactory(void); 
 
        //IUnknown members 
        STDMETHODIMP QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //IClassFactory members 
        STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID 
                                 , PPVOID); 
        STDMETHODIMP         LockServer(BOOL); 
    }; 
 
typedef CPolylineClassFactory *PCPolylineClassFactory; 
 
 
 
//POLYWIN.CPP 
LRESULT APIENTRY PolylineWndProc(HWND, UINT, WPARAM, LPARAM); 
 
 
//Forward class references 
class CImpIPolyline; 
typedef class CImpIPolyline *PCImpIPolyline; 
 
class CImpIConnPtCont; 
typedef CImpIConnPtCont *PCImpIConnPtCont; 
 
class CConnectionPoint; 
typedef CConnectionPoint *PCConnectionPoint; 
 
class CImpIPersistStorage; 
typedef class CImpIPersistStorage *PCImpIPersistStorage; 
 
class CImpIPersistStreamInit; 
typedef class CImpIPersistStreamInit *PCImpIPersistStreamInit; 
 
 
//CHAPTER10MOD 
class CImpIDataObject; 
typedef class CImpIDataObject *PCImpIDataObject; 
 
#define CFORMATETCGET       3 
#define CFORMATETCSET       1 
//End CHAPTER10MOD 
 
 
//POLYLINE.CPP 
class CPolyline : public IUnknown 
    { 
    friend LRESULT APIENTRY PolylineWndProc(HWND, UINT, WPARAM 
        , LPARAM); 
 
    friend class CImpIPolyline; 
    friend class CImpIConnPtCont; 
    friend class CConnectionPoint; 
    friend class CImpIPersistStorage; 
    friend class CImpIPersistStreamInit; 
 
    //CHAPTER10MOD 
    friend class CImpIDataObject; 
    //End CHAPTER10MOD 
 
    protected: 
        HWND            m_hWnd; 
        HINSTANCE       m_hInst; 
 
        ULONG           m_cRef;         //Object reference count 
        LPUNKNOWN       m_pUnkOuter;    //Controlling Unknown 
        PFNDESTROYED    m_pfnDestroy;   //Function called on closure 
        BOOL            m_fDirty;       //Have we changed? 
        POLYLINEDATA    m_pl;           //Our actual data 
 
        //Contained interfaces 
        PCImpIPolyline          m_pImpIPolyline; 
        PCImpIConnPtCont        m_pImpIConnPtCont; 
        PCImpIPersistStorage    m_pImpIPersistStorage; 
        PCImpIPersistStreamInit m_pImpIPersistStreamInit; 
        //CHAPTER10MOD 
        PCImpIDataObject        m_pImpIDataObject; 
        //End CHAPTER10MOD 
 
        /* 
         * Connected sink:  only one per object.  We get this 
         * through our connection point. 
         */ 
        //CHAPTER10MOD 
        IPolylineAdviseSink10  *m_pAdv; 
        //End CHAPTER10MOD 
        PCConnectionPoint       m_pConnPt; 
 
        PCStringTable   m_pST;          //Object strings 
        UINT            m_cf;           //Object clipboard format 
        CLSID           m_clsID;        //Current CLSID 
 
        //We have to hold these for IPersistStorage::Save 
        LPSTORAGE       m_pIStorage; 
        LPSTREAM        m_pIStream; 
 
        //CHAPTER10MOD 
        LPDATAADVISEHOLDER  m_pIDataAdviseHolder; 
        //End CHAPTER10MOD 
 
 
    protected: 
        void      PointScale(LPRECT, LPPOINTS, BOOL); 
        void      Draw(HDC, BOOL, BOOL); 
        void      RectConvertMappings(LPRECT, BOOL); 
 
        //CHAPTER10MOD 
        /* 
         * These members pulled from IPolyline now serve as a 
         * central store for this functionality to be used from 
         * other interfaces like IPersistStorage and IDataObject. 
         * Other interfaces later may also use them. 
         */ 
        STDMETHODIMP DataSet(PPOLYLINEDATA, BOOL, BOOL); 
        STDMETHODIMP DataGet(PPOLYLINEDATA); 
 
        STDMETHODIMP RenderNative(HGLOBAL *); 
        STDMETHODIMP RenderBitmap(HBITMAP *); 
        STDMETHODIMP RenderMetafilePict(HGLOBAL *); 
        //End CHAPTER10MOD 
 
 
    public: 
        CPolyline(LPUNKNOWN, PFNDESTROYED, HINSTANCE); 
        ~CPolyline(void); 
 
        BOOL      Init(void); 
 
        //Non-delegating object IUnknown 
        STDMETHODIMP QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
    }; 
 
typedef CPolyline *PCPolyline; 
 
 
 
 
//Interface implementations contained in the Polyline. 
 
//CHPATER10MOD 
class CImpIPolyline : public IPolyline10 
//End CHAPTER10MOD 
    { 
    protected: 
        ULONG               m_cRef;      //Interface ref count 
        PCPolyline          m_pObj;      //Backpointer to object 
        LPUNKNOWN           m_pUnkOuter; //Controlling unknown 
 
    public: 
        CImpIPolyline(PCPolyline, LPUNKNOWN); 
        ~CImpIPolyline(void); 
 
        //IUnknown members. 
        STDMETHODIMP QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //CHAPTER10MOD 
        //Data* and Render* replaced with IDataObject 
        //End CHAPTER10MOD 
 
        //Manipulation members: 
        STDMETHODIMP Init(HWND, LPRECT, DWORD, UINT); 
        STDMETHODIMP New(void); 
        STDMETHODIMP Undo(void); 
        STDMETHODIMP Window(HWND *); 
 
        STDMETHODIMP RectGet(LPRECT); 
        STDMETHODIMP SizeGet(LPRECT); 
        STDMETHODIMP RectSet(LPRECT, BOOL); 
        STDMETHODIMP SizeSet(LPRECT, BOOL); 
 
        STDMETHODIMP ColorSet(UINT, COLORREF, COLORREF *); 
        STDMETHODIMP ColorGet(UINT, COLORREF *); 
 
        STDMETHODIMP LineStyleSet(UINT, UINT *); 
        STDMETHODIMP LineStyleGet(UINT *); 
    }; 
 
 
class CImpIConnPtCont : public IConnectionPointContainer 
    { 
    private: 
        ULONG               m_cRef;      //Interface ref count 
        PCPolyline          m_pObj;      //Back pointer to object 
        LPUNKNOWN           m_pUnkOuter; //Controlling unknown 
 
    public: 
        CImpIConnPtCont(PCPolyline, LPUNKNOWN); 
        ~CImpIConnPtCont(void); 
 
        //IUnknown members 
        STDMETHODIMP         QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(DWORD) AddRef(void); 
        STDMETHODIMP_(DWORD) Release(void); 
 
        //IConnectionPointContainer members 
        STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints **); 
    STDMETHODIMP FindConnectionPoint(REFIID, IConnectionPoint **); 
    }; 
 
 
/* 
 * This connection point will only allow one connection, 
 * so it always returns the same connection key.  It also 
 * doesn't bother to implement enumerations. 
 */ 
 
#define CCONNMAX    1 
#define ADVISEKEY   72388       //Arbitrary 
 
class CConnectionPoint : public IConnectionPoint 
    { 
    private: 
        ULONG           m_cRef;     //Object reference count 
        PCPolyline      m_pObj;     //Containing object. 
 
    public: 
        CConnectionPoint(PCPolyline); 
        ~CConnectionPoint(void); 
 
        //IUnknown members 
        STDMETHODIMP         QueryInterface(REFIID, LPVOID *); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //IConnectionPoint members 
        STDMETHODIMP GetConnectionInterface(IID *); 
        STDMETHODIMP GetConnectionPointContainer 
            (IConnectionPointContainer **); 
        STDMETHODIMP Advise(LPUNKNOWN, DWORD *); 
        STDMETHODIMP Unadvise(DWORD); 
        STDMETHODIMP EnumConnections(IEnumConnections **); 
    }; 
 
 
 
class CImpIPersistStorage : public IPersistStorage 
    { 
    protected: 
        ULONG               m_cRef;      //Interface reference count 
        PCPolyline          m_pObj;      //Back pointer to object 
        LPUNKNOWN           m_pUnkOuter; //Controlling unknown 
        PSSTATE             m_psState;   //Storage state 
 
    public: 
        CImpIPersistStorage(PCPolyline, LPUNKNOWN); 
        ~CImpIPersistStorage(void); 
 
        STDMETHODIMP QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        STDMETHODIMP GetClassID(LPCLSID); 
 
        STDMETHODIMP IsDirty(void); 
        STDMETHODIMP InitNew(LPSTORAGE); 
        STDMETHODIMP Load(LPSTORAGE); 
        STDMETHODIMP Save(LPSTORAGE, BOOL); 
        STDMETHODIMP SaveCompleted(LPSTORAGE); 
        STDMETHODIMP HandsOffStorage(void); 
    }; 
 
 
class CImpIPersistStreamInit : public IPersistStreamInit 
    { 
    protected: 
        ULONG               m_cRef;      //Interface reference count 
        PCPolyline          m_pObj;      //Back pointer to object 
        LPUNKNOWN           m_pUnkOuter; //Controlling unknown 
 
    public: 
        CImpIPersistStreamInit(PCPolyline, LPUNKNOWN); 
        ~CImpIPersistStreamInit(void); 
 
        STDMETHODIMP QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        STDMETHODIMP GetClassID(LPCLSID); 
 
        STDMETHODIMP IsDirty(void); 
        STDMETHODIMP Load(LPSTREAM); 
        STDMETHODIMP Save(LPSTREAM, BOOL); 
        STDMETHODIMP GetSizeMax(ULARGE_INTEGER *); 
        STDMETHODIMP InitNew(void); 
    }; 
 
 
//CHAPTER10MOD 
//IDATAOBJ.CPP 
class CImpIDataObject : public IDataObject 
    { 
    private: 
        ULONG               m_cRef;      //Interface reference count 
        PCPolyline          m_pObj;      //Back pointer to object 
        LPUNKNOWN           m_pUnkOuter; //Controlling unknown 
 
    public: 
        CImpIDataObject(PCPolyline, LPUNKNOWN); 
        ~CImpIDataObject(void); 
 
        //IUnknown members that delegate to m_pUnkOuter. 
        STDMETHODIMP         QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //IDataObject members 
        STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM); 
        STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM); 
        STDMETHODIMP QueryGetData(LPFORMATETC); 
        STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC); 
        STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL); 
        STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *); 
        STDMETHODIMP DAdvise(LPFORMATETC, DWORD, LPADVISESINK 
            , DWORD *); 
        STDMETHODIMP DUnadvise(DWORD); 
        STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *); 
    }; 
 
//End CHAPTER10MOD 
 
#endif  //_POLYLINE_H_