CPOLY.H
/***  
*cpoly.h 
* 
*  This is a part of the Microsoft Source Code Samples. 
* 
*  Copyright 1992 - 1998 Microsoft Corporation. All rights reserved. 
* 
*  This source code is only intended as a supplement to Microsoft Development 
*  Tools and/or WinHelp documentation.  See these sources for detailed 
*  information regarding the Microsoft samples programs. 
* 
*Purpose: 
*  Definition of the CPoly class. 
* 
*  The CPoly class defines a number of methods and exposes them for 
*  external programmability via IDispatch, 
* 
*  methods: 
*    DRAW- draw the polygon 
*    RESET- delete all points from the polygon 
* 
*    ADDPOINT(X, Y)- add a point with coordinates (x,y) to the polygon 
* 
*    ENUMPOINTS- return a collection of the polygon's points 
* 
*    GETXORIGIN- get and set the X origin of the polygon 
*    SETXORIGIN 
* 
*    GETYORIGIN- get and set the Y origin of the polygon 
*    SETYORIGIN 
* 
*    GETWIDTH- get and set the line width of the polygon 
*    SETWIDTH 
* 
*  UNDONE: update description 
* 
*Implementation Notes: 
* 
*****************************************************************************/ 
 
 
#ifndefCLASS 
# ifdef__TURBOC__ 
#  define CLASS class huge 
# else 
#  define CLASS class FAR 
# endif 
#endif 
 
class CPoint; 
 
CLASS CPoly : public IDispatch 
{ 
public: 
    static CPoly FAR* Create(); 
 
    /* IUnknown methods */ 
    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj); 
    STDMETHOD_(unsigned long, AddRef)(void); 
    STDMETHOD_(unsigned long, Release)(void); 
 
    /* IDispatch methods */ 
    STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo); 
 
    STDMETHOD(GetTypeInfo)( 
      unsigned int iTypeInfo, 
      LCID lcid, 
      ITypeInfo FAR* FAR* ppTypeInfo); 
 
    STDMETHOD(GetIDsOfNames)( 
      REFIID riid, 
      OLECHAR FAR* FAR* rgszNames, 
      unsigned int cNames, 
      LCID lcid, 
      DISPID FAR* rgdispid); 
 
    STDMETHOD(Invoke)( 
      DISPID dispidMember, 
      REFIID riid, 
      LCID lcid, 
      unsigned short wFlags, 
      DISPPARAMS FAR* pdispparams, 
      VARIANT FAR* pvarResult, 
      EXCEPINFO FAR* pexcepinfo, 
      unsigned int FAR* puArgErr); 
 
    /* Introduced methods */ 
 
    virtual void  METHODCALLTYPE EXPORT Draw(void); 
    virtual void  METHODCALLTYPE EXPORT Reset(void); 
 
    // add a point with the given 'x' and 'y' coordinates 
    virtual HRESULT METHODCALLTYPE EXPORT AddPoint(short x, short y); 
 
    // return a collection of the polygon's points 
    virtual IUnknown FAR* METHODCALLTYPE EXPORT EnumPoints(void); 
 
    // get/set the polygon's X origin property 
    virtual short METHODCALLTYPE EXPORT GetXOrigin(void); 
    virtual void  METHODCALLTYPE EXPORT SetXOrigin(short x); 
 
    // get/set the polygon's Y origin property 
    virtual short METHODCALLTYPE EXPORT GetYOrigin(void); 
    virtual void  METHODCALLTYPE EXPORT SetYOrigin(short y); 
 
    virtual short METHODCALLTYPE EXPORT GetWidth(void); 
    virtual void  METHODCALLTYPE EXPORT SetWidth(short width); 
 
    virtual short METHODCALLTYPE EXPORT get_red(void); 
    virtual void  METHODCALLTYPE EXPORT set_red(short red); 
 
    virtual short METHODCALLTYPE EXPORT get_green(void); 
    virtual void  METHODCALLTYPE EXPORT set_green(short green); 
 
    virtual short METHODCALLTYPE EXPORT get_blue(void); 
    virtual void  METHODCALLTYPE EXPORT set_blue(short blue); 
 
    // Debug method 
    virtual void  METHODCALLTYPE EXPORT Dump(void); 
    virtual void  METHODCALLTYPE EXPORT Quit(void); 
 
public:  
 
    // Draw all polygons. 
    static void PolyDraw(void); 
 
    // Release all polygons. 
    static void PolyTerm(void); 
 
    // Dump all polygons to dbwin. 
    static void PolyDump(void); 
 
 
private: 
    CPoly(); 
 
    short m_xorg; 
    short m_yorg; 
    short m_width; 
 
    short m_red; 
    short m_green; 
    short m_blue; 
 
    unsigned long m_refs; 
    unsigned int m_cPoints; 
 
    ITypeInfo FAR* m_ptinfo; 
 
    POINTLINK FAR* m_ppointlink; 
    POINTLINK FAR* m_ppointlinkLast; 
}; 
 
// DISPIDs for the members and properties available via IDispatch. 
// 
enum IDMEMBER_CPOLY { 
    IDMEMBER_CPOLY_DRAW = 1, 
    IDMEMBER_CPOLY_RESET, 
    IDMEMBER_CPOLY_ADDPOINT, 
    IDMEMBER_CPOLY_ENUMPOINTS, 
    IDMEMBER_CPOLY_GETXORIGIN, 
    IDMEMBER_CPOLY_SETXORIGIN, 
    IDMEMBER_CPOLY_GETYORIGIN, 
    IDMEMBER_CPOLY_SETYORIGIN, 
    IDMEMBER_CPOLY_GETWIDTH, 
    IDMEMBER_CPOLY_SETWIDTH, 
    IDMEMBER_CPOLY_GETRED, 
    IDMEMBER_CPOLY_SETRED, 
    IDMEMBER_CPOLY_GETGREEN, 
    IDMEMBER_CPOLY_SETGREEN, 
    IDMEMBER_CPOLY_GETBLUE, 
    IDMEMBER_CPOLY_SETBLUE, 
    IDMEMBER_CPOLY_DUMP, 
    IDMEMBER_CPOLY_QUIT, 
    IDMEMBER_CPOLY_MAX 
}; 
 
// CPoly method indices 
// 
enum IMETH_CPOLY { 
    IMETH_CPOLY_QUERYINTERFACE = 0, 
    IMETH_CPOLY_ADDREF, 
    IMETH_CPOLY_RELEASE, 
    IMETH_CPOLY_GETTYPEINFOCOUNT, 
    IMETH_CPOLY_GETTYPEINFO, 
    IMETH_CPOLY_GETIDSOFNAMES, 
    IMETH_CPOLY_INVOKE, 
    IMETH_CPOLY_DRAW, 
    IMETH_CPOLY_RESET, 
    IMETH_CPOLY_ADDPOINT, 
    IMETH_CPOLY_ENUMPOINTS, 
    IMETH_CPOLY_GETXORIGIN, 
    IMETH_CPOLY_SETXORIGIN, 
    IMETH_CPOLY_GETYORIGIN, 
    IMETH_CPOLY_SETYORIGIN, 
    IMETH_CPOLY_GETWIDTH, 
    IMETH_CPOLY_SETWIDTH, 
    IMETH_CPOLY_GETRED, 
    IMETH_CPOLY_SETRED, 
    IMETH_CPOLY_GETGREEN, 
    IMETH_CPOLY_SETGREEN, 
    IMETH_CPOLY_GETBLUE, 
    IMETH_CPOLY_SETBLUE, 
    IMETH_CPOLY_DUMP, 
    IMETH_CPOLY_QUIT, 
    IMETH_CPOLY_MAX 
}; 
 
// structure used to link together polygons 
// 
struct POLYLINK { 
    POLYLINK FAR* next; 
    CPoly FAR* ppoly; 
}; 
 
 
// The CPoly class factory 
// 
CLASS CPolyCF : public IClassFactory 
{ 
public: 
    static IClassFactory FAR* Create(); 
 
    /* IUnknown methods */ 
    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv); 
    STDMETHOD_(unsigned long, AddRef)(void); 
    STDMETHOD_(unsigned long, Release)(void); 
 
    /* IClassFactory methods */ 
    STDMETHOD(CreateInstance)( 
      IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv); 
#ifdef _MAC 
    STDMETHOD(LockServer)(unsigned long fLock); 
#else 
    STDMETHOD(LockServer)(BOOL fLock); 
#endif 
 
private: 
    CPolyCF(); 
 
    unsigned long m_refs; 
};