• ChartCtrl源码剖析之——CChartAxisLabel类


    CChartAxisLabel类用来绘制轴标签,上、下、左、右都可以根据实际需要设置对应的轴标签。它处于该控件的区域,如下图所示:

    CChartAxisLabel类的头文件。

    #if !defined(AFX_CHARTAXISLABEL_H__0E5519C8_A2F4_4CED_9681_32A56B25D0C5__INCLUDED_)
    #define AFX_CHARTAXISLABEL_H__0E5519C8_A2F4_4CED_9681_32A56B25D0C5__INCLUDED_
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include "ChartObject.h"
    #include "ChartString.h"
    class CChartAxis;
    class CChartAxisLabel : public CChartObject  
    {
        friend CChartAxis;
    public:
        void SetText(const TChartString& NewText);
        TChartString GetText() const        { return m_strLabelText;    }
        void SetFont(int nPointSize, const TChartString& strFaceName);
        CChartAxisLabel(CChartCtrl* pParent, bool bHorizontal);
        virtual ~CChartAxisLabel();
    private:
        void SetPosition(int LeftBorder, int TopBorder, CDC *pDC);
        void Draw(CDC* pDC);
        CSize GetSize(CDC* pDC) const;
        bool m_bIsHorizontal;      // Specifies if the axis is horizontal or not
        int  m_iFontSize;
        TChartString m_strFontName;
        TChartString m_strLabelText;
    };
    #endif // !defined(AFX_CHARTAXISLABEL_H__0E5519C8_A2F4_4CED_9681_32A56B25D0C5__INCLUDED_)

    CChartAxisLabel类的源文件。

    #include "stdafx.h"
    #include "ChartAxisLabel.h"
    #include "ChartCtrl.h"
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    CChartAxisLabel::CChartAxisLabel(CChartCtrl* pParent, bool bHorizontal):CChartObject(pParent)
    {
        m_bIsHorizontal = bHorizontal;
        m_iFontSize = 100;
        m_strFontName = _T("Microsoft Sans Serif");
        m_strLabelText = _T("");
    }
    CChartAxisLabel::~CChartAxisLabel()
    {
    }
    void CChartAxisLabel::SetText(const TChartString& NewText)  
    {
        m_strLabelText = NewText;
        m_pParent->RefreshCtrl();
    }
    void CChartAxisLabel::SetFont(int nPointSize, const TChartString& strFaceName)
    {
        m_iFontSize = nPointSize;
        m_strFontName = strFaceName;
        m_pParent->RefreshCtrl();
    }
    CSize CChartAxisLabel::GetSize(CDC *pDC) const
    {
        CSize LabelSize;
        LabelSize.cx = 0;
        LabelSize.cy = 0;
        if (!m_bIsVisible)
            return LabelSize;
        if (!pDC->GetSafeHdc())
            return LabelSize;
        if (m_strLabelText == _T(""))
            return LabelSize;
        CFont NewFont;
        CFont* pOldFont;
        NewFont.CreatePointFont(m_iFontSize,m_strFontName.c_str(),pDC);
        pOldFont = pDC->SelectObject(&NewFont);
        LabelSize = pDC->GetTextExtent(m_strLabelText.c_str());
        LabelSize.cx += 4;
        LabelSize.cy += 4;
        if (!m_bIsHorizontal)
        {
            int Width = LabelSize.cy;
            int Height = LabelSize.cx;
            LabelSize.cx = Width;
            LabelSize.cy = Height;
        }
        pDC->SelectObject(pOldFont);
        DeleteObject(NewFont);
        return LabelSize;
    }
    void CChartAxisLabel::Draw(CDC *pDC)
    {
        if (!m_bIsVisible)
            return;
        if (!pDC->GetSafeHdc())
            return;
        if (m_strLabelText == _T(""))
            return;
        int iPrevMode = pDC->SetBkMode(TRANSPARENT);
        COLORREF OldColor = pDC->SetTextColor(m_ObjectColor);
        CFont NewFont;
        NewFont.CreatePointFont(m_iFontSize,m_strFontName.c_str(),pDC);
        CFont* pOldFont;
        if (!m_bIsHorizontal)
        {
            LOGFONT LogFont;
            NewFont.GetLogFont(&LogFont);
            LogFont.lfOrientation = 900;
            LogFont.lfEscapement = 900;
            CFont VertFont;
            VertFont.CreateFontIndirect(&LogFont);
            pOldFont = pDC->SelectObject(&VertFont);
            pDC->ExtTextOut(m_ObjectRect.left + 2,m_ObjectRect.top,
                        ETO_CLIPPED,NULL,m_strLabelText.c_str(),NULL);
            pDC->SelectObject(pOldFont);
            DeleteObject(VertFont);
            DeleteObject(NewFont);
        }
        else
        {        
            pOldFont = pDC->SelectObject(&NewFont);
            pDC->ExtTextOut(m_ObjectRect.left,m_ObjectRect.top + 2,
                        ETO_CLIPPED,NULL,m_strLabelText.c_str(),NULL);
            pDC->SelectObject(pOldFont);
            DeleteObject(NewFont);
        }
        pDC->SetBkMode(iPrevMode);
        pDC->SetTextColor(OldColor);
    }
    void CChartAxisLabel::SetPosition(int LeftBorder, int TopBorder, CDC *pDC)
    {
        CSize NewSize = GetSize(pDC);
        CRect NewRect;
        NewRect.top = TopBorder;
        NewRect.bottom = TopBorder + NewSize.cy;
        NewRect.left = LeftBorder;
        NewRect.right = LeftBorder + NewSize.cx;
        CChartObject::SetRect(NewRect);
    }

    CChartAxisLabel类在CChartAxis类中设定最终绘制的位置。 

    作者:常想一二
    出处:http://www.cnblogs.com/wolfmvp/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    (二)php的常量和变量
    关于标签系统的一点想法。
    Linux运维工程师中级面试题
    Linux C 编程内存泄露检测工具(一):mtrace
    掌握sudo的使用
    Scala极速入门
    处理千万级以上的数据提高查询速度的方法
    linux svn服务器搭建、客户端操作、备份与恢复
    select/poll/epoll 对比
    汇编指令和标志寄存器
  • 原文地址:https://www.cnblogs.com/wolfmvp/p/7207073.html
Copyright © 2020-2023  润新知