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 / chap10 / ddataobj / dataobj.h < prev    next >
C/C++ Source or Header  |  1995-05-03  |  6KB  |  199 lines

  1. /*
  2.  * DATAOBJ.H
  3.  * Data Object Chapter 6
  4.  *
  5.  * Classes that implement the Data Object independent of whether
  6.  * we live in a DLL or EXE.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Right Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14.  
  15.  
  16. #ifndef _DATAOBJ_H_
  17. #define _DATAOBJ_H_
  18.  
  19. #define INC_OLE2
  20. #define CHAPTER10
  21. #include <inole.h>
  22.  
  23. //Data size types
  24. #define DOSIZE_SMALL        0
  25. #define DOSIZE_MEDIUM       1
  26. #define DOSIZE_LARGE        2
  27. #define DOSIZE_CSIZES       3
  28.  
  29. //Data sizes
  30. #define CCHTEXTSMALL        64      //Text grows * 16 charactrs
  31. #define CCHTEXTMEDIUM       1024
  32. #define CCHTEXTLARGE        16384
  33.  
  34. #define CXYBITMAPSMALL      16      //Bitmaps grow * 4 pixels
  35. #define CXYBITMAPMEDIUM     64
  36. #define CXYBITMAPLARGE      256
  37.  
  38. #define CRECMETAFILESMALL   4       //Metafiles grows * 9 records;
  39. #define CRECMETAFILEMEDIUM  12      //the number of actual records
  40. #define CRECMETAFILELARGE   36      //is the square of these
  41.  
  42.  
  43. //Resources for this data object.
  44. #define IDB_MIN             1       //Keep this DOSIZE_SMALL+1
  45. #define IDB_16BY16          1
  46. #define IDB_64BY64          2
  47. #define IDB_256BY256        3
  48. #define IDB_MAX             3
  49.  
  50.  
  51. #define IDR_MENU                        1
  52. #define IDR_ADVISORICON                 1
  53.  
  54. #define IDM_ADVISEITERATIONSMIN         100
  55. #define IDM_ADVISEITERATIONS16          100
  56. #define IDM_ADVISEITERATIONS64          101
  57. #define IDM_ADVISEITERATIONS144         102
  58. #define IDM_ADVISEITERATIONS256         103
  59. #define IDM_ADVISEITERATIONS400         104
  60. #define IDM_ADVISEITERATIONS572         105
  61.  
  62.  
  63.  
  64.  
  65. /*
  66.  * The DataObject object is implemented in its own class with its
  67.  * own IUnknown to support aggregation.  It contains one
  68.  * CImpIDataObject object that we use to implement the externally
  69.  * exposed interfaces.
  70.  */
  71.  
  72. #define CFORMATETCGET       3
  73.  
  74.  
  75. //DATAOBJ.CPP
  76. LRESULT APIENTRY AdvisorWndProc(HWND, UINT, WPARAM, LPARAM);
  77.  
  78. class CImpIDataObject;
  79. typedef class CImpIDataObject *PCImpIDataObject;
  80.  
  81.  
  82. class CDataObject : public IUnknown
  83.     {
  84.     friend class CImpIDataObject;
  85.     friend LRESULT APIENTRY AdvisorWndProc(HWND, UINT
  86.         , WPARAM, LPARAM);
  87.  
  88.     protected:
  89.         ULONG               m_cRef;
  90.         LPUNKNOWN           m_pUnkOuter;
  91.         PFNDESTROYED        m_pfnDestroy;
  92.  
  93.         UINT                m_iSize;        //Data size for Render*
  94.         HBITMAP             m_rghBmp[DOSIZE_CSIZES]; //Cache bitmaps
  95.  
  96.         HWND                m_hWndAdvise;   //Popup with Advise menu
  97.         DWORD               m_dwAdvFlags;   //Notification flags
  98.  
  99.         //Contained interface implemetation
  100.         PCImpIDataObject    m_pImpIDataObject;
  101.  
  102.         //Other interfaces used, implemented elsewhere
  103.         LPDATAADVISEHOLDER  m_pIDataAdviseHolder;
  104.  
  105.         //Arrays for IDataObject::EnumFormatEtc
  106.         ULONG               m_cfeGet;
  107.         FORMATETC           m_rgfeGet[CFORMATETCGET];
  108.  
  109.     protected:
  110.         //Functions for use from IDataObject::GetData
  111.         HRESULT     RenderText(LPSTGMEDIUM);
  112.         HRESULT     RenderBitmap(LPSTGMEDIUM);
  113.         HRESULT     RenderMetafilePict(LPSTGMEDIUM);
  114.  
  115.     public:
  116.         CDataObject(LPUNKNOWN, PFNDESTROYED, UINT);
  117.         ~CDataObject(void);
  118.  
  119.         BOOL Init(void);
  120.  
  121.         //Non-delegating object IUnknown
  122.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  123.         STDMETHODIMP_(ULONG) AddRef(void);
  124.         STDMETHODIMP_(ULONG) Release(void);
  125.     };
  126.  
  127. typedef CDataObject *PCDataObject;
  128.  
  129.  
  130.  
  131. /*
  132.  * Interface implementations for the CDataObject object.
  133.  */
  134.  
  135. class CImpIDataObject : public IDataObject
  136.     {
  137.     private:
  138.         ULONG           m_cRef;
  139.         PCDataObject    m_pObj;
  140.         LPUNKNOWN       m_pUnkOuter;
  141.  
  142.     public:
  143.         CImpIDataObject(PCDataObject, LPUNKNOWN);
  144.         ~CImpIDataObject(void);
  145.  
  146.         //IUnknown members that delegate to m_pUnkOuter.
  147.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  148.         STDMETHODIMP_(ULONG) AddRef(void);
  149.         STDMETHODIMP_(ULONG) Release(void);
  150.  
  151.         //IDataObject members
  152.         STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
  153.         STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
  154.         STDMETHODIMP QueryGetData(LPFORMATETC);
  155.         STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC);
  156.         STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL);
  157.         STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *);
  158.         STDMETHODIMP DAdvise(LPFORMATETC, DWORD,  LPADVISESINK
  159.             , DWORD *);
  160.         STDMETHODIMP DUnadvise(DWORD);
  161.         STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *);
  162.     };
  163.  
  164.  
  165.  
  166. /*
  167.  * IEnumFORMATETC object that is created from
  168.  * IDataObject::EnumFormatEtc.  This object lives on its own.
  169.  */
  170.  
  171. class CEnumFormatEtc : public IEnumFORMATETC
  172.     {
  173.     private:
  174.         ULONG           m_cRef;         //Object reference count
  175.         ULONG           m_iCur;         //Current element.
  176.         ULONG           m_cfe;          //Number of FORMATETCs in us
  177.         LPFORMATETC     m_prgfe;        //Source of FORMATETCs
  178.  
  179.     public:
  180.         CEnumFormatEtc(ULONG, LPFORMATETC);
  181.         ~CEnumFormatEtc(void);
  182.  
  183.         //IUnknown members
  184.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  185.         STDMETHODIMP_(ULONG) AddRef(void);
  186.         STDMETHODIMP_(ULONG) Release(void);
  187.  
  188.         //IEnumFORMATETC members
  189.         STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG *);
  190.         STDMETHODIMP Skip(ULONG);
  191.         STDMETHODIMP Reset(void);
  192.         STDMETHODIMP Clone(IEnumFORMATETC **);
  193.     };
  194.  
  195.  
  196. typedef CEnumFormatEtc *PCEnumFormatEtc;
  197.  
  198. #endif //_DATAOBJ_H_
  199.