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

Windows编程

开发平台:

Visual C++

  1. /*+==========================================================================
  2.   File:      PAPER.H
  3.   Summary:   Include file for the connectable COPaper COM object class.
  4.              COPaper offers a main standard IUnknown interface (basic COM
  5.              object features), an implementation of the standard
  6.              IConnectionPointContainer interface (connectable object
  7.              features), and an implementation of the custom ISharePaper
  8.              interface (shared drawing Paper-related features). This
  9.              multiple interface COM Object Class is achieved via the
  10.              technique of nested classes.  The implementation of the
  11.              IConnectionPointContainer and ISharePaper interfaces are
  12.              nested inside of the COPaper Class.
  13.              APPUTIL's CThreaded OwnThis technology is used in COPaper to
  14.              ensure mutually exclusive access by contending multiple
  15.              client threads.
  16.              For a comprehensive tutorial code tour of this module's
  17.              contents and offerings see the tutorial DCDSERVE.HTM file.
  18.              For more specific technical details on the internal workings
  19.              see the comments dispersed throughout the module's source code.
  20.   Functions: .
  21.   Classes:   COPaper.
  22.   Origin:    8-23-97: atrent - Editor-inheritance from BALL.H in
  23.              the CONSERVE Tutorial Code Sample. [Revised]
  24. ----------------------------------------------------------------------------
  25.   This file is part of the Microsoft COM Tutorial Code Samples.
  26.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  27.   This source code is intended only as a supplement to Microsoft
  28.   Development Tools and/or on-line documentation.  See these other
  29.   materials for detailed information regarding Microsoft code samples.
  30.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  31.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  32.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  33.   PARTICULAR PURPOSE.
  34. ==========================================================================+*/
  35. #if !defined(PAPER_H)
  36. #define PAPER_H
  37. #ifdef __cplusplus
  38. // Current format version of Ink Data is 1.0. Thus, the format version
  39. // is a compile-time constant.
  40. #define INKDATA_VERSION10 MAKELONG(0,1)
  41. // InkData allocation sizes for the Dynamic InkData array.
  42. enum
  43. {
  44.   INKDATA_ALLOC_INIT = 3200,
  45.   INKDATA_ALLOC = 800
  46. };
  47. // The Ink Data structure.
  48. typedef struct _INKDATA
  49. {
  50.   SHORT nType;            // Ink Type.
  51.   SHORT nX;               // X-coordinate of ink point.
  52.   SHORT nY;               // Y-coordinate of ink point.
  53.   SHORT nWidth;           // Ink line width.
  54.   COLORREF crColor;       // Ink color.
  55. } INKDATA;
  56. // Properties of our electronic paper.
  57. #define PAPER_TITLE_SIZE 64
  58. typedef struct _PAPER_PROPERTIES
  59. {
  60.   LONG lInkDataVersion;
  61.   LONG lInkArraySize;
  62.   COLORREF crWinColor;
  63.   RECT WinRect;
  64.   WCHAR wszTitle[PAPER_TITLE_SIZE];
  65.   WCHAR wszAuthor[PAPER_TITLE_SIZE];
  66.   WCHAR wszReserved1[PAPER_TITLE_SIZE];
  67.   WCHAR wszReserved2[PAPER_TITLE_SIZE];
  68. } PAPER_PROPERTIES;
  69. // Drawing Paper event constants.
  70. enum PAPER_EVENT
  71. {
  72.   PAPER_EVENT_NONE = 0,
  73.   PAPER_EVENT_LOCKED,
  74.   PAPER_EVENT_UNLOCKED,
  75.   PAPER_EVENT_LOADED,
  76.   PAPER_EVENT_SAVED,
  77.   PAPER_EVENT_INKSTART,
  78.   PAPER_EVENT_INKDRAW,
  79.   PAPER_EVENT_INKSTOP,
  80.   PAPER_EVENT_ERASED,
  81.   PAPER_EVENT_RESIZED
  82. };
  83. // Some strings used in file storage.
  84. #define STREAM_PAPERDATA_USTR L"PAPERDATA"
  85. #define CLIPBDFMT_STR "CTS.SharePaper.1"
  86. #define PAP_FILE_EXT ".PAP"
  87. /*O+O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O
  88.   ObjectClass: COPaper
  89.   Summary:     COM object class for COPaper COM objects.  COM objects of
  90.                this class offer custom ISharePaper interface features,
  91.                InitPaper, Lock, InkStart, InkDraw, InkStop, GetInk, Erase,
  92.                Resize. To make COPaper objects connectable, the standard
  93.                IConnectionPointContainer interface features,
  94.                FindConnectionPoint and EnumConnectionPoints are also
  95.                implemented. The mulitple interfaces on this COM object are
  96.                constructed via the nested interface classes technique.
  97.                COPaper is also derived from APPUTIL's CThreaded to provide
  98.                the OwnThis thread safety mechanism.
  99.   Interfaces:  IUnknown
  100.                  Standard interface providing COM object features.
  101.                IConnectionPointContainer
  102.                  Standard Connection Point container features rendering
  103.                  COPaper objects connectable objects.
  104.                ISharePaper
  105.                  Custom interface providing basic electronic drawing paper
  106.                  features for a shared drawing.
  107.   Aggregation: Yes, COPaper COM Objects are aggregatable by passing
  108.                a non-NULL pUnkOuter IUnknown pointer into the constructor.
  109. O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O-O*/
  110. class COPaper : public IUnknown, public CThreaded
  111. {
  112.   public:
  113.     // Main Object Constructor & Destructor.
  114.     COPaper(IUnknown* pUnkOuter, CServer* pServer);
  115.     ~COPaper(void);
  116.     // A general method for initializing this newly created object.
  117.     // Creates any subordinate arrays, structures, or objects.
  118.     HRESULT Init(void);
  119.     // IUnknown methods. Main object, non-delegating.
  120.     STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  121.     STDMETHODIMP_(ULONG) AddRef(void);
  122.     STDMETHODIMP_(ULONG) Release(void);
  123.   private:
  124.     // We declare nested class interface implementations here.
  125.     class CImpIConnectionPointContainer : public IConnectionPointContainer,
  126.                                           public CThreaded
  127.     {
  128.       public:
  129.         // Interface Implementation Constructor & Destructor.
  130.         CImpIConnectionPointContainer(COPaper* pCO, IUnknown* pUnkOuter);
  131.         ~CImpIConnectionPointContainer(void);
  132.         // IUnknown methods.
  133.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  134.         STDMETHODIMP_(ULONG) AddRef(void);
  135.         STDMETHODIMP_(ULONG) Release(void);
  136.         // IConnectionPointContainer methods.
  137.         STDMETHODIMP         FindConnectionPoint(REFIID, IConnectionPoint**);
  138.         STDMETHODIMP         EnumConnectionPoints(IEnumConnectionPoints**);
  139.       private:
  140.         // Data private to this interface implementation.
  141.         COPaper*      m_pCO;          // Parent Object back pointer.
  142.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  143.     };
  144.     class CImpISharePaper : public ISharePaper, public CThreaded
  145.     {
  146.       public:
  147.         // Interface Implementation Constructor & Destructor.
  148.         CImpISharePaper(COPaper* pCO, IUnknown* pUnkOuter);
  149.         ~CImpISharePaper(void);
  150.         // IUnknown methods.
  151.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  152.         STDMETHODIMP_(ULONG) AddRef(void);
  153.         STDMETHODIMP_(ULONG) Release(void);
  154.         // ISharePaper methods.
  155.         STDMETHODIMP         InitPaper(RECT* pWinRect, BOOL* pbFirst);
  156.         STDMETHODIMP         Lock(BOOL bLock);
  157.         STDMETHODIMP         Load(RECT* pWinRect);
  158.         STDMETHODIMP         Save(void);
  159.         STDMETHODIMP         InkStart(
  160.                                SHORT nX,
  161.                                SHORT nY,
  162.                                SHORT nWidth,
  163.                                COLORREF crInkColor);
  164.         STDMETHODIMP         InkDraw(SHORT nX, SHORT nY);
  165.         STDMETHODIMP         InkStop(SHORT nX, SHORT nY);
  166.         STDMETHODIMP         GetInk(
  167.                                LONG lIndex,
  168.                                SHORT* pnInkType,
  169.                                SHORT* pnX,
  170.                                SHORT* pnY,
  171.                                SHORT* pnInkWidth,
  172.                                COLORREF* pcrInkColor);
  173.         STDMETHODIMP         Erase(void);
  174.         STDMETHODIMP         Resize(
  175.                                LONG lWidth,
  176.                                LONG lHeight);
  177.       private:
  178.         // Data private to this interface implementation of ISharePaper.
  179.         COPaper*      m_pCO;          // Parent Object back pointer.
  180.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  181.         // The following private data and methods constitute the working
  182.         // heart of COPaper as an actual application object.
  183.         PAPER_PROPERTIES m_PaperProperties; // For file storage.
  184.         UINT          m_ClipBdFmt;    // ClipBoard Format.
  185.         BOOL          m_bLocked;      // Paper lock state.
  186.         RECT          m_WinRect;      // Current Window rectangle.
  187.         COLORREF      m_crWinColor;   // Current window background color.
  188.         COLORREF      m_crInkColor;   // Current ink color.
  189.         SHORT         m_nInkWidth;    // Current ink width.
  190.         LONG          m_lInkDataEnd;  // Current end of the ink data.
  191.         LONG          m_lInkDataMax;  // Current end of the ink data array.
  192.         INKDATA*      m_paInkData;    // Dynamic Ink data array pointer.
  193.         // Private utility methods of this interface implementation.
  194.         HRESULT NextSlot(void);
  195.     };
  196.     // Make the otherwise private and nested ISharePaper and
  197.     // IConnectionPointContainer interface implementations a friend to
  198.     // COM object instantiations of this COPaper COM object class.
  199.     friend CImpIConnectionPointContainer;
  200.     friend CImpISharePaper;
  201.     // Private method of main connectable COPaper COM object to broadcast
  202.     // event notifications to all connected listening sinks.
  203.     HRESULT NotifySinks(
  204.               PAPER_EVENT PaperEvent,
  205.               SHORT nX,
  206.               SHORT nY,
  207.               SHORT nInkWidth,
  208.               COLORREF crInkColor);
  209.     // Private data of COPaper COM objects.
  210.     // Nested ISharePaper implementation instantiation. This interface
  211.     // is instantiated inside this COPaper object as a native interface.
  212.     CImpISharePaper   m_ImpISharePaper;
  213.     // Nested IConnectionPointContainer implementation instantiation.
  214.     CImpIConnectionPointContainer m_ImpIConnectionPointContainer;
  215.     // Main Object reference count.
  216.     ULONG             m_cRefs;
  217.     // Outer unknown (aggregation & delegation).
  218.     IUnknown*         m_pUnkOuter;
  219.     // Pointer to this component server's control object.
  220.     CServer*          m_pServer;
  221.     // The file path name for the paper file containing the shared drawing.
  222.     TCHAR             m_szPapFile[MAX_PATH];
  223.     // The array of connection points for this connectable COM object.
  224.     IConnectionPoint* m_aConnectionPoints[MAX_CONNECTION_POINTS];
  225. };
  226. #endif // __cplusplus
  227. #endif // PAPER_H