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

Windows编程

开发平台:

Visual C++

  1. /*+==========================================================================
  2.   File:      TEXTPAGE.H
  3.   Summary:   Include file for the connectable COTextPage COM object class.
  4.              COTextPage offers a main standard IUnknown interface (basic
  5.              COM object features), an implementation of the standard
  6.              IConnectionPointContainer interface (connectable object
  7.              features), an implementation of the standard
  8.              IPersistStreamInit interface (stream persistent object
  9.              features), and an implementation of the custom ITextPage
  10.              interface (editable TextPage features). This multiple
  11.              interface COM Object Class is achieved via the technique of
  12.              nested classes.  The implementation of the various interfaces
  13.              are nested inside of the COTextPage Class.
  14.              For a comprehensive tutorial code tour of this module's
  15.              contents and offerings see the tutorial PERTEXT.HTM file.
  16.              For more specific technical details on the internal workings
  17.              see the comments dispersed throughout the module's source code.
  18.   Functions: .
  19.   Classes:   COTextPage.
  20.   Origin:    5-20-97: atrent - Editor-inheritance from PAPER.H in
  21.              the STOSERVE Tutorial Code Sample.
  22. ----------------------------------------------------------------------------
  23.   This file is part of the Microsoft COM Tutorial Code Samples.
  24.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  25.   This source code is intended only as a supplement to Microsoft
  26.   Development Tools and/or on-line documentation.  See these other
  27.   materials for detailed information regarding Microsoft code samples.
  28.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  29.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  30.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  31.   PARTICULAR PURPOSE.
  32. ==========================================================================+*/
  33. #if !defined(TEXTPAGE_H)
  34. #define TEXTPAGE_H
  35. #ifdef __cplusplus
  36. // Current format version of TextPage is 1.0. Thus, the format version
  37. // is a compile-time constant.
  38. #define TEXTPAGE_VERSION10 MAKELONG(0,1)
  39. // TextPage allocation sizes for the TextPage.
  40. enum
  41. {
  42.   TEXTPAGE_V10_MAX = 32000
  43. };
  44. // Properties of the TextPage.
  45. typedef struct _TEXTPROPS
  46. {
  47.   ULONG ulVersion;
  48.   ULONG ulMaxLength;
  49.   ULONG ulLength;
  50.   WCHAR wszTitle[PAGE_TITLE_SIZE];
  51. } TEXTPROPS;
  52. // TextPage event constants.
  53. enum TEXTPAGE_EVENT
  54. {
  55.   TEXTPAGE_EVENT_NONE = 0,
  56.   TEXTPAGE_EVENT_LOADED,
  57.   TEXTPAGE_EVENT_SAVED,
  58.   TEXTPAGE_EVENT_PUT,
  59.   TEXTPAGE_EVENT_CLEARED
  60. };
  61. /*O+O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O
  62.   ObjectClass: COTextPage
  63.   Summary:     COM object class for COTextPage COM objects.  COM objects
  64.                of this class offer custom ITextPage interface features,
  65.                GetLength, GetText, PutText, and Clear. To make COTextPage
  66.                objects connectable, the standard IConnectionPointContainer
  67.                interface features, FindConnectionPoint and
  68.                EnumConnectionPoints are also implemented. The mulitple
  69.                interfaces on this COM object are constructed via the
  70.                nested interface classes technique.
  71.   Interfaces:  IUnknown
  72.                  Standard interface providing COM object features.
  73.                IConnectionPointContainer
  74.                  Standard Connection Point container features rendering
  75.                  COTextPage objects connectable objects.
  76.                IPersistStreamInit
  77.                  Standard Stream Persistance features rendering
  78.                  COTextPage objects persistent objects.
  79.                ITextPage
  80.                  Custom interface providing basic TextPage features.
  81.   Aggregation: Yes, COTextPage COM Objects are aggregatable by passing
  82.                a non-NULL pUnkOuter IUnknown pointer into the constructor.
  83. O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O-O*/
  84. class COTextPage : public IUnknown
  85. {
  86.   public:
  87.     // Main COM Object Constructor & Destructor.
  88.     COTextPage(IUnknown* pUnkOuter, CServer* pServer);
  89.     ~COTextPage(void);
  90.     // A general public method for initializing this newly created
  91.     // object. Creates any subordinate arrays, structures, or objects.
  92.     // Not exposed as part of an interface. Used by Class Factory.
  93.     HRESULT Init(void);
  94.     // Main COM Object IUnknown interface. Non-delegating.
  95.     STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  96.     STDMETHODIMP_(ULONG) AddRef(void);
  97.     STDMETHODIMP_(ULONG) Release(void);
  98.   private:
  99.     // We declare nested class interface implementations here.
  100.     // Standard Connectable Object features.
  101.     class CImpIConnectionPointContainer : public IConnectionPointContainer
  102.     {
  103.       public:
  104.         // Interface Implementation Constructor & Destructor.
  105.         CImpIConnectionPointContainer(COTextPage* pCO, IUnknown* pUnkOuter);
  106.         ~CImpIConnectionPointContainer(void);
  107.         // IUnknown methods.
  108.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  109.         STDMETHODIMP_(ULONG) AddRef(void);
  110.         STDMETHODIMP_(ULONG) Release(void);
  111.         // IConnectionPointContainer methods.
  112.         STDMETHODIMP         FindConnectionPoint(REFIID, IConnectionPoint**);
  113.         STDMETHODIMP         EnumConnectionPoints(IEnumConnectionPoints**);
  114.       private:
  115.         // Data private to this interface implementation.
  116.         COTextPage*   m_pCO;          // Parent Object back pointer.
  117.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  118.     };
  119.     // Standard Object Persistence (in Streams) features.
  120.     class CImpIPersistStreamInit : public IPersistStreamInit
  121.     {
  122.       public:
  123.         // Interface Implementation Constructor & Destructor.
  124.         CImpIPersistStreamInit(COTextPage* pCO, IUnknown* pUnkOuter);
  125.         ~CImpIPersistStreamInit(void);
  126.         // IUnknown methods.
  127.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  128.         STDMETHODIMP_(ULONG) AddRef(void);
  129.         STDMETHODIMP_(ULONG) Release(void);
  130.         // IPersistStreamInit methods.
  131.         STDMETHODIMP         GetClassID(CLSID* pClassID);
  132.         STDMETHODIMP         IsDirty(void);
  133.         STDMETHODIMP         Load(IStream* pIStream);
  134.         STDMETHODIMP         Save(IStream* pIStream, BOOL bClearDirty);
  135.         STDMETHODIMP         GetSizeMax(ULARGE_INTEGER* pcbSize);
  136.         STDMETHODIMP         InitNew(void);
  137.       private:
  138.         // Data private to this interface implementation.
  139.         COTextPage*   m_pCO;          // Parent Object back pointer.
  140.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  141.     };
  142.     // Custom Text Entry/Edit page features.
  143.     class CImpITextPage : public ITextPage
  144.     {
  145.       public:
  146.         // Interface Implementation Constructor & Destructor.
  147.         CImpITextPage(COTextPage* pCO, IUnknown* pUnkOuter);
  148.         ~CImpITextPage(void);
  149.         // IUnknown methods.
  150.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  151.         STDMETHODIMP_(ULONG) AddRef(void);
  152.         STDMETHODIMP_(ULONG) Release(void);
  153.         // ITextPage methods.
  154.         STDMETHODIMP         GetLength(INT* piLength);
  155.         STDMETHODIMP         GetText(WCHAR* pwszText);
  156.         STDMETHODIMP         PutText(WCHAR* pwszText, INT iLength);
  157.         STDMETHODIMP         Clear(BOOL bSaveNeeded);
  158.       private:
  159.         // Data private to this interface implementation of ITextPage.
  160.         COTextPage*   m_pCO;          // Parent Object back pointer.
  161.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  162.     };
  163.     // Make the otherwise private and nested interface implementations
  164.     // friends to instantiations of this COTextPage COM object class.
  165.     friend CImpIConnectionPointContainer;
  166.     friend CImpIPersistStreamInit;
  167.     friend CImpITextPage;
  168.     // Private Methods of COTextPage COM objects.
  169.     // Method to clear the COTextPage's current page text and reset
  170.     // the page properties appropriately.
  171.     HRESULT Clear(BOOL bSaveNeeded);
  172.     // Method of main connectable COTextPage COM object to broadcast
  173.     // event notifications to all connected listening sinks.
  174.     HRESULT NotifySinks(TEXTPAGE_EVENT TextPageEvent);
  175.     // Private Data of COTextPage COM objects.
  176.     // Nested IConnectionPointContainer implementation instantiation.
  177.     CImpIConnectionPointContainer m_ImpIConnectionPointContainer;
  178.     // Nested IPersistStreamInit implementation instantiation.
  179.     CImpIPersistStreamInit m_ImpIPersistStreamInit;
  180.     // Nested ITextPage implementation instantiation. This ITextPage
  181.     // interface is instantiated as a native interface of COTextPage.
  182.     CImpITextPage     m_ImpITextPage;
  183.     // Main Object reference count.
  184.     ULONG             m_cRefs;
  185.     // Outer unknown (aggregation & delegation).
  186.     IUnknown*         m_pUnkOuter;
  187.     // Pointer to this component server's control object.
  188.     CServer*          m_pServer;
  189.     // The array of connection points for this connectable COM object.
  190.     IConnectionPoint* m_aConnectionPoints[MAX_CONNECTION_POINTS];
  191.     // The following private data and methods constitute the working
  192.     // heart of COTextPage as an actual application object.
  193.     TEXTPROPS         m_TextProps;    // For saving properties in stream.
  194.     CLSID             m_ClassID;      // CLSID of this COM Object.
  195.     WCHAR*            m_pwszPageText; // The text to edit.
  196.     BOOL              m_bInitNew;     // TRUE=>obj newly initialized in RAM.
  197.     BOOL              m_bDirty;       // RAM no match file--save needed.
  198. };
  199. #endif // __cplusplus
  200. #endif // TEXTPAGE_H