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

Windows编程

开发平台:

Visual C++

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