// Created by Larry Leonard, Definitive Solutions, Inc. #if !defined(MYGRAPHH__9DB68B4D_3C7C_47E2_9F72_EEDA5D2CDBB0__INCLUDED_) #define MYGRAPHH__9DB68B4D_3C7C_47E2_9F72_EEDA5D2CDBB0__INCLUDED_ #pragma once ///////////////////////////////////////////////////////////////////////////// // MyGraphSeries class MyGraphSeries : public CObject { friend class MyGraph; // Construction. public: MyGraphSeries(const CString& sLabel = ""); virtual ~MyGraphSeries(); // Declared but not defined. private: MyGraphSeries(const MyGraphSeries& rhs); MyGraphSeries& operator=(const MyGraphSeries& rhs); // Operations. public: void SetLabel(const CString& sLabel); CString GetLabel() const; void SetData(int nGroup, int nValue); int GetData(int nGroup) const; // Implementation. private: int GetMaxDataValue() const; int GetNonZeroElementCount() const; int GetDataTotal() const; void SetTipRegion(int nGroup, const CRect& rc); void SetTipRegion(int nGroup, const CRgn* prgn); int HitTest(const CPoint& pt) const; CString GetTipText(int nGroup) const; // Data. private: CString m_sLabel; // Series label. CDWordArray m_dwaValues; // Values array. CObArray m_oaRegions; // Tooltip regions. }; ///////////////////////////////////////////////////////////////////////////// // MyGraph class MyGraph : public CStatic { // Enum. public: enum GraphType { Bar, Line, Pie }; // Construction. public: MyGraph(GraphType eGraphType = MyGraph::Pie); virtual ~MyGraph(); // Declared but not defined. private: MyGraph(const MyGraph& rhs); MyGraph& operator=(const MyGraph& rhs); // Operations. public: void AddSeries(MyGraphSeries& rMyGraphSeries); void SetXAxisLabel(const CString& sLabel); void SetYAxisLabel(const CString& sLabel); int AppendGroup(const CString& sLabel); void SetLegend(int nGroup, const CString& sLabel); void SetGraphType(GraphType eType); void SetGraphTitle(const CString& sTitle); int LookupLabel(const CString& sLabel) const; // Implementation. private: void DrawGraph(CDC& dc); void DrawTitle(CDC& dc); void SetupAxes(CDC& dc); void DrawAxes(CDC& dc) const; void DrawLegend(CDC& dc); void DrawSeriesBar(CDC& dc) const; void DrawSeriesLine(CDC& dc) const; void DrawSeriesPie(CDC& dc) const; int GetMaxLegendLabelLength(CDC& dc) const; int GetMaxSeriesSize() const; int GetMaxNonZeroSeriesSize() const; int GetMaxDataValue() const; int GetNonZeroSeriesCount() const; CString GetTipText() const; int OnToolHitTest(CPoint point, TOOLINFO* pTI) const; void CreateTipRgn(CDC& dc, const CRect& rcPie, const CPoint& ptCenter, const CPoint& ptStart, const CPoint& ptEnd) const; CPoint WedgeEndFromDegrees(int nDegrees, const CPoint& ptCenter, int nRadius) const; // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(MyGraph) protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL // Generated message map functions protected: //{{AFX_MSG(MyGraph) afx_msg void OnPaint(); afx_msg void OnSize(UINT nType, int cx, int cy); //}}AFX_MSG afx_msg bool OnNeedText(UINT uiId, NMHDR* pNMHDR, LRESULT* pResult); DECLARE_MESSAGE_MAP() // Data. private: int m_nXAxisWidth; int m_nYAxisHeight; CPoint m_ptOrigin; CRect m_rcGraph; CRect m_rcLegend; CRect m_rcTitle; CString m_sXAxisLabel; CString m_sYAxisLabel; CString m_sTitle; CDWordArray m_dwaColors; CStringArray m_saLegendLabels; CObList m_olMyGraphSeries; GraphType m_eGraphType; }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(MYGRAPHH__9DB68B4D_3C7C_47E2_9F72_EEDA5D2CDBB0__INCLUDED_)