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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * COSMO.H
  3.  * Cosmo Chapter 14
  4.  *
  5.  * Single include file that pulls in everything needed for other
  6.  * source files in the Cosmo application.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14. #ifndef _COSMO_H_
  15. #define _COSMO_H_
  16. #define INC_CLASSLIB
  17. //CHAPTER14MOD
  18. #define INC_AUTOMATION
  19. #define GUIDS_FROM_TYPELIB
  20. #define CHAPTER14
  21. #include <memory.h>
  22. //End CHAPTER14MOD
  23. #include <inole.h>
  24. #include "resource.h"
  25. //CHAPTER14MOD
  26. //Get the Automation interfaces
  27. #include "icosmo.h"
  28. //End CHAPTER14MOD
  29. //Get the editor window information.
  30. #include "polyline.h"
  31. //CHAPTER14MOD
  32. /*
  33.  * Forward reference automation object classes for our frame
  34.  * and document classes which then contain them.
  35.  */
  36. class CAutoApp;
  37. typedef CAutoApp *PCAutoApp;
  38. class CClassFactory;
  39. typedef CClassFactory *PCClassFactory;
  40. class CAutoFigures;
  41. typedef CAutoFigures *PCAutoFigures;
  42. class CAutoFigure;
  43. typedef CAutoFigure *PCAutoFigure;
  44. //End CHAPTER14MOD
  45. //COSMO.CPP:  Frame object that creates a main window
  46. class CCosmoFrame : public CFrame
  47.     {
  48.     //CHAPTER14MOD
  49.     friend CClassFactory;
  50.     friend CAutoApp;
  51.     friend CAutoFigures;
  52.     //End CHAPTER14MOD
  53.     private:
  54.         HBITMAP         m_hBmpLines[5];     //Menu item bitmaps
  55.         UINT            m_uIDCurLine;       //Current line selection
  56.         BOOL            m_fInitialized;     //Did OleInitalize work?
  57.         LPCLASSFACTORY  m_pIClassDataTran;  //For locking
  58.         //CHAPTER14MOD
  59.         BOOL            m_fEmbedding;   //-Embedding flag?
  60.         BOOL            m_fAutomation;  //-Automation flag?
  61.         PCAutoApp       m_pAutoApp;     //Implements ICosmoApplication
  62.         DWORD           m_dwActiveApp;  //From RegisterActiveObject
  63.         PCClassFactory  m_pIClassFactoryApp;
  64.         DWORD           m_dwRegCOApp;
  65.         PCClassFactory  m_pIClassFactoryFig;
  66.         DWORD           m_dwRegCOFig;
  67.         //End CHAPTER14MOD
  68.     protected:
  69.         //Overridable for creating a CClient for this frame
  70.         virtual PCClient  CreateCClient(void);
  71.         virtual BOOL      RegisterAllClasses(void);
  72.         virtual BOOL      PreShowInit(void);
  73.         virtual UINT      CreateToolbar(void);
  74.         virtual LRESULT   OnCommand(HWND, WPARAM, LPARAM);
  75.         virtual void      OnDocumentDataChange(PCDocument);
  76.         virtual void      OnDocumentActivate(PCDocument);
  77.         //New for this class
  78.         virtual void      CreateLineMenu(void);
  79.     public:
  80.         CCosmoFrame(HINSTANCE, HINSTANCE, LPSTR, int);
  81.         virtual ~CCosmoFrame(void);
  82.         //Overrides
  83.         virtual BOOL      Init(PFRAMEINIT);
  84.         virtual void      UpdateMenus(HMENU, UINT);
  85.         virtual void      UpdateToolbar(void);
  86.         //New for this class
  87.         virtual void      CheckLineSelection(UINT);
  88.         //CHAPTER14MOD
  89.         PCAutoApp         AutoApp(void);
  90.         //End CHAPTER14MOD
  91.     };
  92. typedef CCosmoFrame *PCCosmoFrame;
  93. //CLIENT.CPP
  94. /*
  95.  * The only reason we have a derived class here is to override
  96.  * CreateCDocument so we can create our own type as well as
  97.  * overriding NewDocument to perform one other piece of work once
  98.  * the document's been created.
  99.  */
  100. class CCosmoClient : public CClient
  101.     {
  102.     //CHAPTER14MOD
  103.     friend class CAutoFigures;
  104.     //End CHAPTER14MOD
  105.     //CHAPTER14MOD
  106.     protected:
  107.         PCAutoFigures   m_pAutoFigures;     //Collection object
  108.     //End CHAPTER14MOD
  109.     protected:
  110.         //Overridable for creating a new CDocument
  111.         virtual PCDocument CreateCDocument(void);
  112.     public:
  113.         CCosmoClient(HINSTANCE, PCFrame);
  114.         virtual ~CCosmoClient(void);
  115.         virtual BOOL       Init(HMENU, LPRECT);
  116.         virtual PCDocument NewDocument(BOOL);
  117.         //CHAPTER14MOD
  118.         PCAutoFigures      AutoFigures(void);
  119.         //End CHAPTER14MOD
  120.     };
  121. typedef CCosmoClient *PCCosmoClient;
  122. //DOCUMENT.CPP
  123. //Constant ID for the window polyline that lives in a document
  124. #define ID_POLYLINE         10
  125. class CCosmoDoc : public CDocument
  126.     {
  127.     friend class CPolylineAdviseSink;
  128.     //CHAPTER14MOD
  129.     friend class CAutoFigure;
  130.     //End CHAPTER14MOD
  131.     protected:
  132.         UINT                    m_uPrevSize;    //Last WM_SIZE wParam
  133.         LONG                    m_lVer;         //Loaded Polyline ver
  134.         PCPolyline              m_pPL;          //Polyline window here
  135.         PCPolylineAdviseSink    m_pPLAdv;       //Advises from Polyline
  136.         //CHAPTER14MOD
  137.         PCAutoFigure            m_pAutoFig;     //ICosmoFigure
  138.         DWORD                   m_dwActiveFig;  //From RegisterActiveObject
  139.         //End CHAPTER14MOD
  140.     protected:
  141.         virtual BOOL     FMessageHook(HWND, UINT, WPARAM, LPARAM
  142.             , LRESULT *);
  143.         virtual BOOL     FQueryPasteFromData(LPDATAOBJECT);
  144.         virtual BOOL     PasteFromData(LPDATAOBJECT);
  145.     public:
  146.         CCosmoDoc(HINSTANCE, PCFrame, PCDocumentAdviseSink);
  147.         virtual ~CCosmoDoc(void);
  148.         virtual BOOL     Init(PDOCUMENTINIT);
  149.         virtual void     Clear(void);
  150.         virtual UINT     Load(BOOL, LPTSTR);
  151.         virtual UINT     Save(UINT, LPTSTR);
  152.         virtual void     Undo(void);
  153.         virtual BOOL     Clip(HWND, BOOL);
  154.         virtual HGLOBAL  RenderFormat(UINT);
  155.         virtual BOOL     FQueryPaste(void);
  156.         virtual BOOL     Paste(HWND);
  157.         virtual COLORREF ColorSet(UINT, COLORREF);
  158.         virtual COLORREF ColorGet(UINT);
  159.         virtual UINT     LineStyleSet(UINT);
  160.         virtual UINT     LineStyleGet(void);
  161.         //CHAPTER14MOD
  162.         PCAutoFigure     AutoFigure(void);
  163.         //End CHAPTER14MOD
  164.     };
  165. typedef CCosmoDoc *PCCosmoDoc;
  166. //These color indices wrap the polyline definitions
  167. #define DOCCOLOR_BACKGROUND             POLYLINECOLOR_BACKGROUND
  168. #define DOCCOLOR_LINE                   POLYLINECOLOR_LINE
  169. //CHAPTER14MOD
  170. //These are global for simplification of object implementation.
  171. extern ULONG g_cObj;
  172. extern ULONG g_cLock;
  173. extern HWND  g_hWnd;
  174. //Function for the object to notify on destruction.
  175. void ObjectDestroyed(void);
  176. //ICLASSF.CPP:  The generic class factory for our automation objects
  177. class CClassFactory : public IClassFactory
  178.     {
  179.     protected:
  180.         ULONG           m_cRef;
  181.         PCCosmoFrame    m_pFR;
  182.         CLSID           m_clsID;
  183.         BOOL            m_fCreated;     //Created one object yet?
  184.     public:
  185.         CClassFactory(PCCosmoFrame, REFCLSID);
  186.         ~CClassFactory(void);
  187.         //IUnknown members
  188.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  189.         STDMETHODIMP_(ULONG) AddRef(void);
  190.         STDMETHODIMP_(ULONG) Release(void);
  191.         //IClassFactory members
  192.         STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID
  193.                                  , PPVOID);
  194.         STDMETHODIMP         LockServer(BOOL);
  195.     };
  196. typedef CClassFactory *PCClassFactory;
  197. //AUTOBASE.CPP
  198. class CImpIDispatch;
  199. typedef CImpIDispatch *PCImpIDispatch;
  200. class CImpIExtConn;
  201. typedef class CImpIExtConn *PCImpIExtConn;
  202. /*
  203.  * CAutoBase is a base class for the other automation objects
  204.  * in this application.  It centralizes the implementation of
  205.  * IDispatch as well as the loading of type information.  Since
  206.  * it implements an IDispatch that calls ITypeInfo directly, this
  207.  * is structured to handle multiple languages although this
  208.  * sample only uses one.
  209.  *
  210.  * The pure virtual VTableInterface makes this an abstract
  211.  * base class.  That one function must be overridden to supply
  212.  * the right interface pointer to IDispatch::Invoke.
  213.  */
  214. class CAutoBase
  215.     {
  216.     friend CImpIDispatch;
  217.     public:
  218.         ULONG           m_cRef; //Public for debug checks
  219.     protected:
  220.         PFNDESTROYED    m_pfnDestroy;
  221.         HINSTANCE       m_hInst;
  222.         /*
  223.          * This union will have some pointer in it.  The CAutoBase
  224.          * implementation stores m_pObj.  Derived classes may
  225.          * reference that pointer as a frame, client, or
  226.          * document pointer.
  227.          */
  228.         union
  229.             {
  230.             void           *m_pObj;
  231.             PCCosmoFrame    m_pFR;
  232.             PCCosmoClient   m_pCL;
  233.             PCCosmoDoc      m_pDoc;
  234.             };
  235.         IID             m_iid;
  236.         IID             m_diid;
  237.         PCImpIDispatch  m_pImpIDispatch;    //Our IDispatch
  238.         PCImpIExtConn   m_pImpIExtConn;     //For app or doc
  239.     protected:
  240.         virtual void *VTableInterface(void)=0;
  241.     public:
  242.         CAutoBase(void *, HINSTANCE, REFIID, REFIID
  243.             , PFNDESTROYED);
  244.         virtual CAutoBase::~CAutoBase(void);
  245.         virtual BOOL    Init(BOOL);
  246.     };
  247. typedef CAutoBase *PCAutoBase;
  248. /*
  249.  * CImpIDispatch is the contained object inside CAutoBase that
  250.  * provides the entry points for IDispatch.  We could use
  251.  * CreateStdDispatch for this, but this sample is structured
  252.  * for multilingual support so we use our own IDispatch.
  253.  */
  254. class CImpIDispatch : public IDispatch
  255.     {
  256.     public:
  257.         ULONG           m_cRef;             //For debugging
  258.         ITypeInfo      *m_pITypeInfo;       //Loaded
  259.     private:
  260.         PCAutoBase      m_pObj;
  261.         LPUNKNOWN       m_pUnkOuter;
  262.     public:
  263.         CImpIDispatch(PCAutoBase, LPUNKNOWN);
  264.         ~CImpIDispatch(void);
  265.         //IUnknown members that delegate to m_pUnkOuter.
  266.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  267.         STDMETHODIMP_(ULONG) AddRef(void);
  268.         STDMETHODIMP_(ULONG) Release(void);
  269.         //IDispatch members
  270.         STDMETHODIMP GetTypeInfoCount(UINT *);
  271.         STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **);
  272.         STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID
  273.             , DISPID *);
  274.         STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD
  275.             , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
  276.     };
  277. /*
  278.  * Implementation of generic IExternalConnection for both the
  279.  * application and document objects which will call the app or
  280.  * document object's Release when the last external connection
  281.  * disappears.
  282.  */
  283. class CImpIExtConn : public IExternalConnection
  284.     {
  285.     protected:
  286.         ULONG           m_cRef;      //Interface reference count
  287.         LPUNKNOWN       m_pUnkOuter; //For delegation, closure
  288.         ULONG           m_cStrong;   //Strong ref count.
  289.     public:
  290.         CImpIExtConn(LPUNKNOWN);
  291.         ~CImpIExtConn(void);
  292.         STDMETHODIMP QueryInterface(REFIID, LPVOID *);
  293.         STDMETHODIMP_(ULONG) AddRef(void);
  294.         STDMETHODIMP_(ULONG) Release(void);
  295.         STDMETHODIMP_(DWORD) AddConnection(DWORD, DWORD);
  296.         STDMETHODIMP_(DWORD) ReleaseConnection(DWORD, DWORD, BOOL);
  297.     };
  298. /*
  299.  * AUTOAPP.CPP:  Implementation of ICosmoApplication.
  300.  */
  301. //Actions for CAutoApp::MoveSize and CAutoFigure::MoveSize helpers
  302. typedef enum
  303.     {
  304.     MOVESIZEACTION_LEFT=0,
  305.     MOVESIZEACTION_TOP,
  306.     MOVESIZEACTION_WIDTH,
  307.     MOVESIZEACTION_HEIGHT,
  308.     MOVESIZEACTION_GETLEFT,
  309.     MOVESIZEACTION_GETTOP,
  310.     MOVESIZEACTION_GETWIDTH,
  311.     MOVESIZEACTION_GETHEIGHT
  312.     } MOVESIZEACTION;
  313. //"Application" object for OLE Automation
  314. class CAutoApp : public CAutoBase, public ICosmoApplication
  315.     {
  316.     protected:
  317.         BOOL            m_fQuitCalled;
  318.     protected:
  319.         long    MoveSize(MOVESIZEACTION, long, long, long, long);
  320.         virtual void *VTableInterface(void);
  321.     public:
  322.         CAutoApp(PCCosmoFrame);
  323.         //IUnknown methods
  324.         STDMETHODIMP QueryInterface(REFIID riid, PPVOID ppv);
  325.         STDMETHODIMP_(ULONG) AddRef(void);
  326.         STDMETHODIMP_(ULONG) Release(void);
  327.         //ICosmoApplication methods
  328.         STDMETHODIMP_(IDispatch *)  get_Application(void);
  329.         STDMETHODIMP_(IDispatch *)  get_ActiveFigure(void);
  330.         STDMETHODIMP_(BSTR)         get_Caption(void);
  331.         STDMETHODIMP_(IDispatch *)  get_Figures(void);
  332.         STDMETHODIMP_(BSTR)         get_FullName(void);
  333.         STDMETHODIMP_(BSTR)         get_Name(void);
  334.         STDMETHODIMP_(BSTR)         get_Path(void);
  335.         STDMETHODIMP_(long)         get_Left(void);
  336.         STDMETHODIMP_(void)         put_Left(long x);
  337.         STDMETHODIMP_(long)         get_Top(void);
  338.         STDMETHODIMP_(void)         put_Top(long y);
  339.         STDMETHODIMP_(long)         get_Width(void);
  340.         STDMETHODIMP_(void)         put_Width(long cx);
  341.         STDMETHODIMP_(long)         get_Height(void);
  342.         STDMETHODIMP_(void)         put_Height(long cy);
  343.         STDMETHODIMP_(VARIANT_BOOL) get_Visible(void);
  344.         STDMETHODIMP_(void)         put_Visible(VARIANT_BOOL);
  345.         STDMETHODIMP_(BSTR)         get_StatusBar(void);
  346.         STDMETHODIMP_(void)         put_StatusBar(BSTR);
  347.         STDMETHODIMP_(void)         Quit(void);
  348.     };
  349. //AUTOFIGS.CPP:  Implementation of ICosmoFigures collection
  350. class CEnumFigures;
  351. typedef CEnumFigures *PCEnumFigures;
  352. class CAutoFigures : public CAutoBase, public ICosmoFigures
  353.     {
  354.     friend CEnumFigures;
  355.     protected:
  356.         IDispatch    *NewFigure(LPTSTR);
  357.         virtual void *VTableInterface(void);
  358.     public:
  359.         CAutoFigures(PCCosmoClient);
  360.         ~CAutoFigures(void);
  361.         //IUnknown methods
  362.         STDMETHODIMP QueryInterface(REFIID riid, PPVOID ppv);
  363.         STDMETHODIMP_(ULONG) AddRef(void);
  364.         STDMETHODIMP_(ULONG) Release(void);
  365.         //ICosmoFigures methods
  366.         STDMETHODIMP_(IDispatch *) get_Application(void);
  367.         STDMETHODIMP_(IDispatch *) get_Parent(void);
  368.         STDMETHODIMP_(long)        get_Count(void);
  369.         STDMETHODIMP_(IDispatch *) Item(VARIANT);
  370.         STDMETHODIMP_(IDispatch *) Add(void);
  371.         STDMETHODIMP_(IDispatch *) Open(BSTR);
  372.         STDMETHODIMP_(void)        Close(void);
  373.         STDMETHODIMP_(IUnknown *)  _NewEnum(void);
  374.     };
  375. typedef CAutoFigures *PCAutoFigures;
  376. //Enumerator of whatever is held in the collection
  377. class CEnumFigures : public IEnumVARIANT
  378.     {
  379.     protected:
  380.         ULONG       m_cRef;
  381.         HWND        m_hList;
  382.         HINSTANCE   m_hInst;
  383.         ULONG       m_iCur;
  384.         ULONG       m_cItems;
  385.     public:
  386.         CEnumFigures(HINSTANCE);
  387.         ~CEnumFigures(void);
  388.         BOOL    Init(HWND, BOOL);
  389.         //IUnknown members
  390.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  391.         STDMETHODIMP_(ULONG) AddRef(void);
  392.         STDMETHODIMP_(ULONG) Release(void);
  393.         //IEnumFORMATETC members
  394.         STDMETHODIMP Next(ULONG, VARIANT *, ULONG *);
  395.         STDMETHODIMP Skip(ULONG);
  396.         STDMETHODIMP Reset(void);
  397.         STDMETHODIMP Clone(IEnumVARIANT **);
  398.     };
  399. /*
  400.  * AUTOFIG.CPP: Implementation of ICosmoFigure object.  This
  401.  * class has no specific data members and only one private
  402.  * function, MoveSize, which is just a helper.  It should be
  403.  * obvious that this class is little more than another route
  404.  * to get at the same functionality we have elsewhere in Cosmo,
  405.  * which is what Automation is really all about when added to
  406.  * an application with a lot of user interface.
  407.  */
  408. class CAutoFigure : public CAutoBase, public ICosmoFigure
  409.     {
  410.     protected:
  411.         long    MoveSize(MOVESIZEACTION, long, long, long, long);
  412.         virtual void *VTableInterface(void);
  413.     public:
  414.         CAutoFigure(PCCosmoDoc);
  415.         //IUnknown members
  416.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  417.         STDMETHODIMP_(ULONG) AddRef(void);
  418.         STDMETHODIMP_(ULONG) Release(void);
  419.         //ICosmoFigure members
  420.         STDMETHODIMP_(IDispatch *)  get_Application(void);
  421.         STDMETHODIMP_(IDispatch *)  get_Parent(void);
  422.         STDMETHODIMP_(BSTR)         get_FullName(void);
  423.         STDMETHODIMP_(BSTR)         get_Name(void);
  424.         STDMETHODIMP_(BSTR)         get_Path(void);
  425.         STDMETHODIMP_(VARIANT_BOOL) get_Saved(void);
  426.         STDMETHODIMP_(short)        get_NumberOfPoints(void);
  427.         STDMETHODIMP_(long)         get_BackColor(void);
  428.         STDMETHODIMP_(void)         put_BackColor(long);
  429.         STDMETHODIMP_(long)         get_LineColor(void);
  430.         STDMETHODIMP_(void)         put_LineColor(long);
  431.         STDMETHODIMP_(short)        get_LineStyle(void);
  432.         STDMETHODIMP_(void)         put_LineStyle(short);
  433.         STDMETHODIMP_(long)         get_Left(void);
  434.         STDMETHODIMP_(void)         put_Left(long);
  435.         STDMETHODIMP_(long)         get_Top(void);
  436.         STDMETHODIMP_(void)         put_Top(long);
  437.         STDMETHODIMP_(long)         get_Width(void);
  438.         STDMETHODIMP_(void)         put_Width(long);
  439.         STDMETHODIMP_(long)         get_Height(void);
  440.         STDMETHODIMP_(void)         put_Height(long);
  441.         STDMETHODIMP_(VARIANT_BOOL) get_Visible(void);
  442.         STDMETHODIMP_(void)         put_Visible(VARIANT_BOOL);
  443.         STDMETHODIMP_(void)         Activate(void);
  444.         STDMETHODIMP_(void)         Close(VARIANT, VARIANT);
  445.         STDMETHODIMP_(void)         RevertToSaved(void);
  446.         STDMETHODIMP_(void)         Save(void);
  447.         STDMETHODIMP_(void)         SaveAs(BSTR);
  448.         STDMETHODIMP_(void)         Import(BSTR);
  449.         STDMETHODIMP_(void)         Copy(void);
  450.         STDMETHODIMP_(void)         Cut(void);
  451.         STDMETHODIMP_(void)         Paste(void);
  452.         STDMETHODIMP_(VARIANT_BOOL) AddPoint(short, short);
  453.         STDMETHODIMP_(void)         RemovePoint(void);
  454.     };
  455. //End CHAPTER14MOD
  456. #endif //_COSMO_H_