home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / tutsamp / conserve / ball.h < prev    next >
C/C++ Source or Header  |  1997-08-05  |  10KB  |  284 lines

  1. /*+==========================================================================
  2.   File:      BALL.H
  3.  
  4.   Summary:   Include file for the connectable COBall COM object class.
  5.  
  6.              COBall offers a main standard IUnknown interface (basic COM
  7.              object features), an implementation of the standard
  8.              IConnectionPointContainer interface (connectable object
  9.              features), and an implementation of the custom IBall
  10.              interface (moving Ball-related features). This multiple
  11.              interface COM Object Class is achieved via the technique of
  12.              nested classes.  The implementation of the
  13.              IConnectionPointContainer and IBall interfaces are nested
  14.              inside of the COBall Class.
  15.  
  16.              This file also declares some internal C++ classes (CXForm and
  17.              CBallThread) that provide internal support for the custom
  18.              IBall interface.
  19.  
  20.              For a comprehensive tutorial code tour of this module's
  21.              contents and offerings see the tutorial CONSERVE.HTM file.
  22.              For more specific technical details on the internal workings
  23.              see the comments dispersed throughout the module's source code.
  24.  
  25.   Functions:
  26.  
  27.   Classes:   CXForm, CBallThread, COBall.
  28.  
  29.   Origin:    5-30-96: atrent - Editor-inheritance from BALL.H in
  30.              the FRESERVE Tutorial Code Sample.
  31.  
  32. ----------------------------------------------------------------------------
  33.   This file is part of the Microsoft COM Tutorial Code Samples.
  34.  
  35.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  36.  
  37.   This source code is intended only as a supplement to Microsoft
  38.   Development Tools and/or on-line documentation.  See these other
  39.   materials for detailed information regarding Microsoft code samples.
  40.  
  41.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  42.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  43.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  44.   PARTICULAR PURPOSE.
  45. ==========================================================================+*/
  46.  
  47. #if !defined(BALL_H)
  48. #define BALL_H
  49.  
  50. #ifdef __cplusplus
  51.  
  52. enum
  53. {
  54.   MAX_BALLTHREADS = 64,
  55.   BALL_MOVE_SKEW = 5
  56. };
  57.  
  58.  
  59. // Bounce event constants.
  60. enum
  61. {
  62.   BOUNCE_NONE = 0,
  63.   BOUNCE_BOTTOM,
  64.   BOUNCE_LEFT,
  65.   BOUNCE_RIGHT,
  66.   BOUNCE_TOP
  67. };
  68.  
  69.  
  70. /*C+C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C
  71.   Class:    CXForm
  72.  
  73.   Summary:  A utility class with methods for performing point
  74.             transformations on points that represent space/location in two
  75.             dimensions.
  76.  
  77.   Methods:  Clear
  78.               Clears the transformation matrix.
  79.             Scale
  80.               Set transformation to multiply by a scale factor.
  81.             Trans
  82.               Perform transformation.
  83.             Point
  84.               Get point.
  85.             CXForm
  86.               Constructor.
  87.             ~CXForm
  88.               Destructor.
  89. C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C-C*/
  90. class CXForm
  91. {
  92.   private:
  93.     int XForm[3][3];
  94.  
  95.   public:
  96.     CXForm(void) {};
  97.     ~CXForm(void) {};
  98.     void Clear(void);
  99.     void Scale(int xScale, int yScale);
  100.     void Trans(int xTrans, int yTrans);
  101.     void Point(POINT* pPoint);
  102. };
  103.  
  104.  
  105. /*C+C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C+++C
  106.   Class:    CBallThread
  107.  
  108.   Summary:  A class for simple objects used to store properties of threads.
  109.             An array of these is used to remember the threads that came
  110.             visiting the COBall object.
  111.  
  112.   Methods:  CBallThread
  113.               Constructor.
  114.             ~CBallThread
  115.               Destructor.
  116. C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C---C-C*/
  117. class CBallThread
  118. {
  119.   public:
  120.     DWORD Id;
  121.     COLORREF Color;
  122.  
  123.     CBallThread(void) {};
  124.     ~CBallThread(void) {};
  125. };
  126.  
  127.  
  128. /*O+O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O
  129.   ObjectClass: COBall
  130.  
  131.   Summary:     COM object class for COBall COM objects.  COM objects of
  132.                this class offer custom IBall interface features, Reset,
  133.                Move, and GetBall. To make COBall objects connectable, the
  134.                standard IConnectionPointContainer interface features,
  135.                FindConnectionPoint and EnumConnectionPoints are
  136.                implemented. The mulitple interfaces on this COM object are
  137.                constructed via the nested interface classes technique.
  138.  
  139.   Interfaces:  IUnknown
  140.                  Standard interface providing COM object features.
  141.                IConnectionPointContainer
  142.                  Standard Connection Point container features rendering
  143.                  COBall objects connectable objects.
  144.                IBall
  145.                  Custom interface providing basic Ball operation features.
  146.  
  147.   Aggregation: Yes, COBall COM Objects are aggregatable by passing
  148.                a non-NULL pUnkOuter IUnknown pointer into the constructor.
  149. O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O-O*/
  150. class COBall : public IUnknown, public CThreaded
  151. {
  152.   public:
  153.     // Main Object Constructor & Destructor.
  154.     COBall(IUnknown* pUnkOuter, CServer* pServer);
  155.     ~COBall(void);
  156.  
  157.     // A general method for initializing this newly created object.
  158.     // Creates any subordinate arrays, structures, or objects.
  159.     HRESULT Init(void);
  160.  
  161.     // IUnknown methods. Main object, non-delegating.
  162.     STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  163.     STDMETHODIMP_(ULONG) AddRef(void);
  164.     STDMETHODIMP_(ULONG) Release(void);
  165.  
  166.   private:
  167.     // We declare nested class interface implementations here.
  168.  
  169.     class CImpIConnectionPointContainer : public IConnectionPointContainer,
  170.                                           public CThreaded
  171.     {
  172.       public:
  173.         // Interface Implementation Constructor & Destructor.
  174.         CImpIConnectionPointContainer(COBall* pBackObj, IUnknown* pUnkOuter);
  175.         ~CImpIConnectionPointContainer(void);
  176.  
  177.         // IUnknown methods.
  178.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  179.         STDMETHODIMP_(ULONG) AddRef(void);
  180.         STDMETHODIMP_(ULONG) Release(void);
  181.  
  182.         // IConnectionPointContainer methods.
  183.         STDMETHODIMP         FindConnectionPoint(REFIID, IConnectionPoint**);
  184.         STDMETHODIMP         EnumConnectionPoints(IEnumConnectionPoints**);
  185.  
  186.       private:
  187.         // Data private to this interface implementation.
  188.         COBall*       m_pBackObj;     // Parent Object back pointer.
  189.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  190.     };
  191.  
  192.     class CImpIBall : public IBall, public CThreaded
  193.     {
  194.       public:
  195.         // Interface Implementation Constructor & Destructor.
  196.         CImpIBall(COBall* pBackObj, IUnknown* pUnkOuter);
  197.         ~CImpIBall(void);
  198.  
  199.         // IUnknown methods.
  200.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  201.         STDMETHODIMP_(ULONG) AddRef(void);
  202.         STDMETHODIMP_(ULONG) Release(void);
  203.  
  204.         // IBall methods.
  205.         STDMETHODIMP         Reset(RECT* pNewRect, short nBallSize);
  206.         STDMETHODIMP         GetBall(
  207.                                POINT* pNewOrg,
  208.                                POINT* pNewExt,
  209.                                COLORREF* pcrColor);
  210.         STDMETHODIMP         Move(BOOL bAlive);
  211.  
  212.       private:
  213.         // Data private to this interface implementation of IBall.
  214.         COBall*       m_pBackObj;     // Parent Object back pointer.
  215.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  216.  
  217.         // The following private data and methods constitute the working
  218.         // heart of COBall as an actual application object.
  219.         BOOL          m_bAlive;
  220.         RECT          m_WinRect;
  221.         int           m_nWidth;
  222.         int           m_nHeight;
  223.         int           m_xDirection;
  224.         int           m_yDirection;
  225.         BOOL          m_bNewPosition;
  226.         int           m_xPosition;
  227.         int           m_yPosition;
  228.         short         m_xSkew;
  229.         short         m_ySkew;
  230.         COLORREF      m_crColor;
  231.         CXForm        m_XForm;
  232.         CBallThread   m_aBallThreads[MAX_BALLTHREADS];
  233.  
  234.         // Private utility methods for internal support of the custom
  235.         // IBall semantics.
  236.         void GetDimensions(POINT*);
  237.         void SetDimensions(int,int);
  238.         void GetDirection(POINT*);
  239.         void SetDirection(int,int);
  240.         void GetPosition(POINT*);
  241.         void SetPosition(int,int);
  242.         void FindThread(void);
  243.         DWORD CheckBounce(void);
  244.     };
  245.  
  246.     // Make the otherwise private and nested IBall and
  247.     // IConnectionPointContainer interface implementations a friend to
  248.     // COM object instantiations of this COBall COM object class.
  249.     friend CImpIConnectionPointContainer;
  250.     friend CImpIBall;
  251.  
  252.     // Private method of main connectable COBall COM object to broadcast
  253.     // event notifications to all connected listening sinks.
  254.     HRESULT NotifySinks(DWORD dwEvent);
  255.  
  256.     // Private data of COBall COM objects.
  257.  
  258.     // Nested IBall implementation instantiation.  This IBall interface
  259.     // is instantiated inside this COBall object as a native interface.
  260.     CImpIBall         m_ImpIBall;
  261.  
  262.     // Nested IConnectionPointContainer implementation instantiation.
  263.     CImpIConnectionPointContainer m_ImpIConnectionPointContainer;
  264.  
  265.     // Main Object reference count.
  266.     ULONG             m_cRefs;
  267.  
  268.     // Outer unknown (aggregation & delegation).
  269.     IUnknown*         m_pUnkOuter;
  270.  
  271.     // Pointer to this component server's control object.
  272.     CServer*          m_pServer;
  273.  
  274.     // The array of connection points for this connectable COM object.
  275.     IConnectionPoint* m_aConnectionPoints[MAX_CONNECTION_POINTS];
  276. };
  277.  
  278. typedef COBall* PCOBall;
  279.  
  280. #endif // __cplusplus
  281.  
  282.  
  283. #endif // BALL_H
  284.