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

  1. #ifdef WIN32
  2.  
  3. #ifdef UNICODE
  4.     #define FROM_OLE_STRING(str) str
  5.     #define TO_OLE_STRING(str) str 
  6. #else
  7.     #define FROM_OLE_STRING(str) ConvertToAnsi(str)
  8.     char* ConvertToAnsi(OLECHAR FAR* szW);  
  9.     #define TO_OLE_STRING(str) ConvertToUnicode(str)
  10.     OLECHAR* ConvertToUnicode(char FAR* szA);   
  11.     // Maximum length of string that can be converted between Ansi & Unicode
  12.     #define STRCONVERT_MAXLEN 300         
  13. #endif
  14.  
  15. #else  // WIN16
  16.   #define APIENTRY far pascal  
  17.   #define TCHAR char
  18.   #define TEXT(sz) sz 
  19.   #define FROM_OLE_STRING(str) str  
  20.   #define TO_OLE_STRING(str) str  
  21.   #define LPTSTR LPSTR
  22.   
  23.   // Windows NT defines the following in windowsx.h
  24.   #define GET_WM_COMMAND_ID(w,l) (w)
  25.   #define GET_WM_COMMAND_CMD(w,l) HIWORD(l)
  26.   #define GET_WM_COMMAND_HWND(w,l) LOWORD(l)
  27. #endif
  28.  
  29. #include "tlb.h"
  30.  
  31. // Menu IDs
  32. #define IDM_DRAWLINE  101
  33. #define IDM_CLEAR     102
  34. #define IDM_EXIT      103  
  35.  
  36. // Dialog ID
  37. #define IDD_DRAWLINE  101
  38. // Icon ID
  39. #define IDI_ICON      102
  40.  
  41. // Dialog Control IDs
  42. #define IDC_THICKNESS     101
  43. #define IDC_CHOOSECOLOR   102
  44. #define IDC_STARTPOINT_X  103
  45. #define IDC_STARTPOINT_Y  104
  46. #define IDC_ENDPOINT_X    105
  47. #define IDC_ENDPOINT_Y    106 
  48. #define IDC_STATIC         -1
  49.  
  50. // MAX len of string table entries
  51. #define STR_LEN   200
  52.  
  53. // String table constants
  54. #define IDS_Name                   1 
  55. #define IDS_ErrorLoadingTypeLib    2
  56. #define IDS_ProgID                 3 
  57. #define IDS_Unexpected             1001
  58. #define IDS_OutOfMemory            1002   
  59. #define IDS_InvalidIndex           1003
  60. #define IDS_CollectionFull         1004
  61. #define IDS_LineFromOtherInstance  1005
  62. #define IDS_CantAddEndPoints       1006  
  63. #define IDS_PointFromOtherInstance 1007 
  64. #define IDS_NoVisibleXCoordinate   1008
  65. #define IDS_NoVisibleYCoordinate   1009  
  66. #define IDS_NoStartPoint           1010
  67. #define IDS_NoEndPoint             1011   
  68.  
  69. // SCODEs for the Lines Application. This is required for vtable-binding
  70. // Automation objects want to return custom HRESULTs. All the OLE-defined 
  71. // FACILITY_ITF codes have a code value which lies in the region 0x0000-0x01FFF.
  72. // While it is legal for the definer to use any code, it is highly recommended
  73. // that only code values in the range 0x0200-0xFFFF be used, as this will reduce the
  74. // possiblity of accidental confusion with any OLE-defined errors.
  75. #define LINES_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x0200)  
  76.  
  77. #define LINES_E_UNEXPECTED              (LINES_E_FIRST + 0x0) 
  78. // Unexpected error
  79. #define LINES_E_OUTOFMEMORY             (LINES_E_FIRST + 0x1) 
  80. // Out of memory
  81. #define LINES_E_INVALIDINDEX            (LINES_E_FIRST + 0x2) 
  82. // Invalid index to Points or Lines collections 
  83. #define LINES_E_COLLECTIONFULL          (LINES_E_FIRST + 0x3) 
  84. // Points or Lines collection is full
  85. #define LINES_E_LINEFROMOTHERINSTANCE   (LINES_E_FIRST + 0x4)
  86. // Line from another instance of this application cannot be added.
  87. #define LINES_E_CANTADDENDPOINTS        (LINES_E_FIRST + 0x5)   
  88. // End points of line cannot be added to collection. (Make sure line has two end points).
  89. #define LINES_E_POINTFROMOTHERINSTANCE  (LINES_E_FIRST + 0x6)
  90. // Point from another instance of this application cannot be added.
  91. #define LINES_E_NOVISIBLEXCOORDINATE    (LINES_E_FIRST + 0x7)
  92. // No visible X coordinate.
  93. #define LINES_E_NOVISIBLEYCOORDINATE    (LINES_E_FIRST + 0x8)
  94. // No visible Y coordinate.
  95. #define LINES_E_NOSTARTPOINT            (LINES_E_FIRST + 0x9)
  96. // Line does not have a start point.
  97. #define LINES_E_NOENDPOINT              (LINES_E_FIRST + 0xA)
  98. // Line does not have an end point.
  99.  
  100. // Number of SCODEs
  101. #define SCODE_COUNT 11   
  102.  
  103. // Function prototypes
  104. int APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);
  105. BOOL InitApplication (HINSTANCE);
  106. BOOL InitInstance (HINSTANCE);
  107. BOOL ProcessCmdLine(LPSTR pCmdLine, LPDWORD pdwRegisterCF, LPDWORD pdwRegisterActiveObject, int nCmdShow);
  108. void Uninitialize(DWORD dwRegisterCF, DWORD dwRegisterActiveObject);
  109. HRESULT LoadTypeInfo(ITypeInfo FAR* FAR* pptinfo, REFCLSID clsid);
  110. HRESULT RaiseException(int nID, REFGUID rguid);
  111.  
  112. #ifdef WIN16
  113. extern "C" LRESULT __export CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM); 
  114. extern "C" BOOL __export CALLBACK DrawLineDialogFunc(HWND, UINT, WPARAM, LPARAM);                  
  115. #else 
  116. extern "C" LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM); 
  117. extern "C" BOOL CALLBACK DrawLineDialogFunc(HWND, UINT, WPARAM, LPARAM); 
  118. #endif   
  119.  
  120. // Class definitions
  121. class CPane;  
  122. class CLine;
  123. class CPoint;
  124. class CLines;
  125. class CPoints;  
  126.  
  127. // ISupportErrorInfo interface implementation
  128. interface CSupportErrorInfo : public ISupportErrorInfo 
  129. {
  130. public:
  131.     // IUnknown methods 
  132.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  133.     STDMETHOD_(ULONG, AddRef)(void);
  134.     STDMETHOD_(ULONG, Release)(void); 
  135.     
  136.     // ISupportErrorInfo method
  137.     STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);  
  138.      
  139.     CSupportErrorInfo(IUnknown FAR* punkObject, REFIID riid); 
  140. private:
  141.     LPUNKNOWN m_punkObject;  // IUnknown of Object that implements this interface 
  142.     GUID m_iid;
  143. };     
  144.  
  145. class FAR CApplicationCF : public IClassFactory
  146. {
  147. public:
  148.     // IUnknown methods 
  149.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  150.     STDMETHOD_(ULONG, AddRef)(void);
  151.     STDMETHOD_(ULONG, Release)(void); 
  152.     
  153.     // IClassFactory methods
  154.     STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid, 
  155.                               void FAR* FAR* ppv);
  156.     STDMETHOD(LockServer)(BOOL fLock);    
  157.     
  158.     CApplicationCF();
  159.     
  160. private:
  161.     ULONG m_cRef;                   // Reference count
  162. }; 
  163.  
  164.     
  165. class FAR CApplication : public IApplication
  166. {
  167. public:
  168.     /* IUnknown methods */
  169.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  170.     STDMETHOD_(ULONG, AddRef)();
  171.     STDMETHOD_(ULONG, Release)();
  172.  
  173.     /* IDispatch methods */
  174.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  175.     STDMETHOD(GetTypeInfo)(       
  176.       UINT itinfo,
  177.       LCID lcid,
  178.       ITypeInfo FAR* FAR* pptinfo);
  179.     STDMETHOD(GetIDsOfNames)(       
  180.       REFIID riid,
  181.       OLECHAR FAR* FAR* rgszNames,
  182.       UINT cNames,
  183.       LCID lcid,
  184.       DISPID FAR* rgdispid);
  185.     STDMETHOD(Invoke)(       
  186.       DISPID dispidMember,
  187.       REFIID riid,
  188.       LCID lcid,
  189.       WORD wFlags,
  190.       DISPPARAMS FAR* pdispparams,
  191.       VARIANT FAR* pvarResult,
  192.       EXCEPINFO FAR* pexcepinfo,
  193.       UINT FAR* puArgErr);
  194.  
  195.     /* IApplication automation exposed properties and methods */   
  196.     STDMETHOD(get_Application)(IApplication FAR* FAR* ppApplication);
  197.     STDMETHOD(get_FullName)(BSTR FAR* pbstr);
  198.     STDMETHOD(get_Name)(BSTR FAR* pbstr);
  199.     STDMETHOD(get_Parent)(IApplication FAR* FAR* ppApplication);
  200.     STDMETHOD(put_Visible)(VARIANT_BOOL bVisible);
  201.     STDMETHOD(get_Visible)(VARIANT_BOOL FAR* pbVisible);
  202.     STDMETHOD(Quit)();
  203.     STDMETHOD(get_Pane)(IPane FAR* FAR* ppPane);
  204.     STDMETHOD(CreateLine)(ILine FAR* FAR* ppLine);
  205.     STDMETHOD(CreatePoint)(IPoint FAR* FAR* ppPoint);
  206.     
  207.     /* CApplication methods */
  208.     STDMETHOD_(void, Draw)();
  209.     STDMETHOD_(void, OnSize)(unsigned int nWidth, unsigned int nHeight);
  210.     STDMETHOD_(void, ShowWindow)(int nCmdShow); 
  211.     STDMETHOD_(void, CreateAndDrawLine)();
  212.     STDMETHOD_(void, ClearPane)();  
  213.     
  214.     static HRESULT Create(HINSTANCE hwnd, CApplication FAR* FAR* ppApplication); // Creates and intializes Applicaton object 
  215.     CApplication();
  216.     ~CApplication();    
  217.     
  218. public:
  219.     HWND m_hwnd;                   // Application window.     
  220.     HINSTANCE m_hinst;             // Hinstance of application. 
  221.     BSTR m_bstrName;               // Name of application.
  222.     BSTR m_bstrProgID;             // ProgID of application. 
  223.     BOOL m_bUserClosing;           // User is closing the application.
  224.     
  225. private:
  226.     LPTYPEINFO m_ptinfo;           // Type information of IApplication interface.
  227.     BSTR m_bstrFullName;           // Full name of application.
  228.     BOOL m_bVisible;               // Is window visible?
  229.     CPane FAR* m_pPane;            // Pointer to the Pane object.   
  230.     ULONG m_cRef;                  // Reference count.   
  231.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  232. };
  233.  
  234. class FAR CPane : public IPane
  235. {
  236. public:
  237.     /* IUnknown methods */
  238.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  239.     STDMETHOD_(ULONG, AddRef)();
  240.     STDMETHOD_(ULONG, Release)();
  241.  
  242.     /* IDispatch methods */
  243.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  244.     STDMETHOD(GetTypeInfo)(       
  245.       UINT itinfo,
  246.       LCID lcid,
  247.       ITypeInfo FAR* FAR* pptinfo);
  248.     STDMETHOD(GetIDsOfNames)(       
  249.       REFIID riid,
  250.       OLECHAR FAR* FAR* rgszNames,
  251.       UINT cNames,
  252.       LCID lcid,
  253.       DISPID FAR* rgdispid);
  254.     STDMETHOD(Invoke)(       
  255.       DISPID dispidMember,
  256.       REFIID riid,
  257.       LCID lcid,
  258.       WORD wFlags,
  259.       DISPPARAMS FAR* pdispparams,
  260.       VARIANT FAR* pvarResult,
  261.       EXCEPINFO FAR* pexcepinfo,
  262.       UINT FAR* puArgErr);
  263.  
  264.     /* IPane automation exposed properties & methods */    
  265.     STDMETHOD(get_Lines)(ILines FAR* FAR* ppLines);
  266.     STDMETHOD(get_Points)(IPoints FAR* FAR* ppPoints);
  267.     STDMETHOD(get_MaxX)(int FAR* pnMaxX);
  268.     STDMETHOD(get_MaxY)(int FAR* pnMaxY);
  269.     STDMETHOD(Clear)();
  270.     STDMETHOD(Refresh)();
  271.     
  272.     /* CPane methods */
  273.     STDMETHOD_(void, Draw)(); 
  274.     STDMETHOD_(void, OnSize)(unsigned int nWidth, unsigned int nHeight);    
  275.     STDMETHOD_(HDC,  GetDC)();  
  276.     STDMETHOD_(void, ReleaseDC)(HDC hdc);   
  277.     STDMETHOD_(void, InvalidateRect)(LPRECT prc);
  278.     STDMETHOD_(void, Update)(void);
  279.     STDMETHOD_(BOOL, AddPoint)(CPoint FAR* pPoint);
  280.     STDMETHOD_(void, RemovePoint)(CPoint FAR* pPoint);
  281.     
  282.     static HRESULT Create(HWND hwnd, CPane FAR* FAR* ppPane); // Creates and intializes Pane object 
  283.     CPane();
  284.     ~CPane();
  285.     
  286. private:
  287.     LPTYPEINFO m_ptinfo;           // Type information of IPane interface.
  288.     HWND m_hwnd;                   // Main window.
  289.     CLines FAR *m_pLines;          // Lines collection.
  290.     CPoints FAR* m_pPoints;        // Points collection.
  291.     int m_nMaxX;                   // Maximum visible X coordinate in twips.
  292.     int m_nMaxY;                   // Maximum visible Y coordinate in twips.
  293.     int m_nWidth;                  // Width of pane in twips.
  294.     int m_nHeight;                 // Height of pane in twips.  
  295.     ULONG m_cRef;                  // Reference count.   
  296.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  297. };
  298.  
  299. class FAR CLine : public ILine
  300. {
  301. public:
  302.     /* IUnknown methods */
  303.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  304.     STDMETHOD_(ULONG, AddRef)();
  305.     STDMETHOD_(ULONG, Release)();
  306.  
  307.     /* IDispatch methods */
  308.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  309.     STDMETHOD(GetTypeInfo)(       
  310.       UINT itinfo,
  311.       LCID lcid,
  312.       ITypeInfo FAR* FAR* pptinfo);
  313.     STDMETHOD(GetIDsOfNames)(       
  314.       REFIID riid,
  315.       OLECHAR FAR* FAR* rgszNames,
  316.       UINT cNames,
  317.       LCID lcid,
  318.       DISPID FAR* rgdispid);
  319.     STDMETHOD(Invoke)(       
  320.       DISPID dispidMember,
  321.       REFIID riid,
  322.       LCID lcid,
  323.       WORD wFlags,
  324.       DISPPARAMS FAR* pdispparams,
  325.       VARIANT FAR* pvarResult,
  326.       EXCEPINFO FAR* pexcepinfo,
  327.       UINT FAR* puArgErr);
  328.  
  329.     /* ILine automation exposed properties & methods */   
  330.     STDMETHOD(get_Color)(long FAR* plColorref);
  331.     STDMETHOD(put_Color)(long lColorref);
  332.     STDMETHOD(get_EndPoint)(IPoint FAR* FAR* ppPoint);
  333.     STDMETHOD(putref_EndPoint)(IPoint FAR* pPoint);
  334.     STDMETHOD(get_StartPoint)(IPoint FAR* FAR* ppPoint);
  335.     STDMETHOD(putref_StartPoint)(IPoint FAR* pPoint);
  336.     STDMETHOD(get_Thickness)(int FAR* pnThickness);
  337.     STDMETHOD(put_Thickness)(int nThickness);
  338.     
  339.     /* CLine methods */
  340.     STDMETHOD_(void, Draw)(HDC hdc);     
  341.     STDMETHOD_(void, GetInvalidateRect)(LPRECT prc);
  342.     STDMETHOD_(BOOL, AddEndPointsToPane)(CPane FAR* pPane);
  343.     STDMETHOD_(void, RemoveEndPointsFromPane)(CPane FAR* pPane);  
  344.     
  345.     static HRESULT Create(CLine FAR* FAR* ppLine); // Creates and intializes Line object 
  346.     CLine();
  347.     ~CLine();
  348.     
  349. private:
  350.     LPTYPEINFO m_ptinfo;           // Type information of ILine interface.
  351.     COLORREF m_colorref;           // RGB color of line.
  352.     CPoint FAR* m_pPointStart;     // Start point of line.
  353.     CPoint FAR* m_pPointEnd;       // End point of line.
  354.     int m_nThickness;              // Line thickness in twips. 
  355.     ULONG m_cRef;                  // Reference count.
  356.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  357. };
  358.  
  359. class FAR CPoint : public IPoint
  360. {
  361. public:
  362.     /* IUnknown methods */
  363.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  364.     STDMETHOD_(ULONG, AddRef)();
  365.     STDMETHOD_(ULONG, Release)();
  366.  
  367.     /* IDispatch methods */
  368.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  369.     STDMETHOD(GetTypeInfo)(       
  370.       UINT itinfo,
  371.       LCID lcid,
  372.       ITypeInfo FAR* FAR* pptinfo);
  373.     STDMETHOD(GetIDsOfNames)(       
  374.       REFIID riid,
  375.       OLECHAR FAR* FAR* rgszNames,
  376.       UINT cNames,
  377.       LCID lcid,
  378.       DISPID FAR* rgdispid);
  379.     STDMETHOD(Invoke)(       
  380.       DISPID dispidMember,
  381.       REFIID riid,
  382.       LCID lcid,
  383.       WORD wFlags,
  384.       DISPPARAMS FAR* pdispparams,
  385.       VARIANT FAR* pvarResult,
  386.       EXCEPINFO FAR* pexcepinfo,
  387.       UINT FAR* puArgErr);
  388.  
  389.     /* IPoint automation exposed properties & methods */    
  390.     STDMETHOD(get_x)(int FAR* pnX);
  391.     STDMETHOD(put_x)(int nX);
  392.     STDMETHOD(get_y)(int FAR* pnY);
  393.     STDMETHOD(put_y)(int nY);
  394.     
  395.     /* CPoint methods */
  396.     STDMETHOD_(ULONG, InternalAddRef)();
  397.     STDMETHOD_(ULONG, InternalRelease)();
  398.     STDMETHOD_(int, get_x)();      
  399.     STDMETHOD_(int, get_y)(); 
  400.     
  401.     static HRESULT Create(CPoint FAR* FAR* ppPoint); // Creates and intializes Point object 
  402.     CPoint();
  403.     ~CPoint();
  404.     
  405. private:
  406.     LPTYPEINFO m_ptinfo;           // Type information of IPoint interface.
  407.     int m_nX;                      // X coordinate of point in twips.
  408.     int m_nY;                      // Y coordinate of point in twips.
  409.     ULONG m_cInternalRef;          // Reference count for the use of the Points collection only.
  410.     ULONG m_cRef;                  // Reference count.  
  411.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  412. };
  413.  
  414. class FAR CLines : public ILines
  415. {
  416. public:
  417.     /* IUnknown methods */
  418.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  419.     STDMETHOD_(ULONG, AddRef)();
  420.     STDMETHOD_(ULONG, Release)();
  421.  
  422.     /* IDispatch methods */
  423.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  424.     STDMETHOD(GetTypeInfo)(       
  425.       UINT itinfo,
  426.       LCID lcid,
  427.       ITypeInfo FAR* FAR* pptinfo);
  428.     STDMETHOD(GetIDsOfNames)(       
  429.       REFIID riid,
  430.       OLECHAR FAR* FAR* rgszNames,
  431.       UINT cNames,
  432.       LCID lcid,
  433.       DISPID FAR* rgdispid);
  434.     STDMETHOD(Invoke)(       
  435.       DISPID dispidMember,
  436.       REFIID riid,
  437.       LCID lcid,
  438.       WORD wFlags,
  439.       DISPPARAMS FAR* pdispparams,
  440.       VARIANT FAR* pvarResult,
  441.       EXCEPINFO FAR* pexcepinfo,
  442.       UINT FAR* puArgErr);
  443.  
  444.     /* ILines automation exposed properties & methods */ 
  445.     STDMETHOD(Add)(ILine FAR* pLine);
  446.     STDMETHOD(get_Count)(long FAR* lCount);
  447.     STDMETHOD(get_Item)(long lIndex, ILine FAR* FAR* ppLine);
  448.     STDMETHOD(get__NewEnum)(IUnknown FAR* FAR* ppunkEnum);
  449.     STDMETHOD(Remove)(long lIndex);
  450.     
  451.     /* CLines methods */
  452.     STDMETHOD_(void, Draw)(HDC hdc);
  453.     STDMETHOD_(void, Clear)();   
  454.     
  455.     static HRESULT Create(ULONG lMaxSize, long lLBound, CPane FAR* pPane, CLines FAR* FAR* ppLines); // Creates and intializes Lines object 
  456.     CLines();
  457.     ~CLines();
  458.     
  459. private:
  460.     LPTYPEINFO m_ptinfo;           // Type information of ILines interface.
  461.     SAFEARRAY FAR *m_psa;          // Safe array that holds Lines collection items.
  462.     ULONG m_cElements;             // Number of items in Lines collection.
  463.     ULONG m_cMax;                  // Maximum number of items Lines collection can hold.
  464.     long m_lLBound;                // Lower bound of index of Lines collection.
  465.     CPane FAR* m_pPane;            // Pointer to the Pane object that contains this Lines collection.  
  466.     ULONG m_cRef;                  // Reference count.     
  467.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  468. };
  469.  
  470. class FAR CPoints : public IPoints
  471. {
  472. public:
  473.     /* IUnknown methods */
  474.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  475.     STDMETHOD_(ULONG, AddRef)();
  476.     STDMETHOD_(ULONG, Release)();
  477.  
  478.     /* IDispatch methods */
  479.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
  480.     STDMETHOD(GetTypeInfo)(       
  481.       UINT itinfo,
  482.       LCID lcid,
  483.       ITypeInfo FAR* FAR* pptinfo);
  484.     STDMETHOD(GetIDsOfNames)(       
  485.       REFIID riid,
  486.       OLECHAR FAR* FAR* rgszNames,
  487.       UINT cNames,
  488.       LCID lcid,
  489.       DISPID FAR* rgdispid);
  490.     STDMETHOD(Invoke)(       
  491.       DISPID dispidMember,
  492.       REFIID riid,
  493.       LCID lcid,
  494.       WORD wFlags,
  495.       DISPPARAMS FAR* pdispparams,
  496.       VARIANT FAR* pvarResult,
  497.       EXCEPINFO FAR* pexcepinfo,
  498.       UINT FAR* puArgErr);
  499.  
  500.     /* IPoints automation exposed properties & methods */    
  501.     STDMETHOD(get_Count)(long FAR* plCount);
  502.     STDMETHOD(get_Item)(long lIndex, IPoint FAR* FAR* ppPoint);
  503.     STDMETHOD(get__NewEnum)(IUnknown FAR* FAR* ppunkEnum);
  504.     
  505.     /* CPoints methods */
  506.     STDMETHOD_(BOOL, Add)(CPoint FAR* pPointNew);
  507.     STDMETHOD_(BOOL, Remove)(CPoint FAR* pPointRemove);
  508.     STDMETHOD_(void, Clear)();   
  509.     STDMETHOD_(void, GetMaxXMaxY)(int FAR* pnX, int FAR* pnY, LPRECT prc);  
  510.     
  511.     static HRESULT Create(ULONG lMaxSize, long lLBound, CPane FAR* pPane, CPoints FAR* FAR* ppPoints); // Creates and intializes Points object 
  512.     CPoints();
  513.     ~CPoints();
  514.     
  515. private:
  516.     LPTYPEINFO m_ptinfo;           // Type information of IPoints interface.
  517.     SAFEARRAY FAR *m_psa;          // Safe array that holds Points collection items.
  518.     ULONG m_cElements;             // Number of items in Points collection.
  519.     ULONG m_cMax;                  // Maximum number of items Points collection can hold.
  520.     long m_lLBound;                // Lower bound of index of Points collection.     
  521.     CPane FAR* m_pPane;            // Pointer to the Pane object that contains this Points collection.  
  522.     ULONG m_cRef;                  // Reference count.
  523.     CSupportErrorInfo m_SupportErrorInfo; // ISupportErrorInfo interface implementation 
  524. };
  525.  
  526. class FAR CEnumVariant : public IEnumVARIANT
  527. {
  528. public:
  529.     // IUnknown methods 
  530.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  531.     STDMETHOD_(ULONG, AddRef)();
  532.     STDMETHOD_(ULONG, Release)();
  533.  
  534.     // IEnumVARIANT methods 
  535.     STDMETHOD(Next)(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched);
  536.     STDMETHOD(Skip)(ULONG cElements);
  537.     STDMETHOD(Reset)();
  538.     STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
  539.     
  540.     static HRESULT Create(SAFEARRAY FAR*, ULONG, CEnumVariant FAR* FAR*); // Creates and intializes Enumerator
  541.     CEnumVariant();
  542.     ~CEnumVariant();
  543.     
  544. private:
  545.     ULONG m_cRef;           // Reference count                                 
  546.     ULONG m_cElements;      // Number of elements in enumerator. 
  547.     long m_lLBound;         // Lower bound of index.
  548.     long m_lCurrent;        // Current index.
  549.     SAFEARRAY FAR* m_psa;   // Safe array that holds elements.
  550. }; 
  551.  
  552. // Structure filled by dialog from user input to create a line.
  553. typedef struct _lineinfo
  554. {
  555.     COLORREF colorref;    // RGB color of line.
  556.     POINT ptStart;        // Start point of line.   
  557.     POINT ptEnd;          // End point of line.
  558.     int nThickness;       // Thickness of line.
  559. } LINEINFO, FAR* LPLINEINFO;
  560.  
  561. extern CApplication FAR* g_pApplication;
  562.