• ChartCtrl源码剖析之——CChartObject类


    首先,做一些简单的铺垫,目前针对ChartCtrl源码的剖析只针对V.15版本。名义上说是剖析,倒不如说是记录下自己针对该控件的理解,非常感谢Cedric Moonen大神,一切的功劳与掌声都该赠予给他。Code Project项目地址:https://www.codeproject.com/Articles/14075/High-speed-Charting-Control。剖析以源码注释加额外说明为主,有记录不妥的地方,欢迎各路大神拍砖,交流与沟通是大家各自进步的基石。
     先概览一下该源码的关键类之间的关系图,做到阅读源码的时候心中有数。 
    CChartObject类的头文件。
    #if !defined(AFX_CHARTOBJECT_H__6ED024F2_00D9_45D5_AB83_258EF0075288__INCLUDED_)
    #define AFX_CHARTOBJECT_H__6ED024F2_00D9_45D5_AB83_258EF0075288__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include <afx.h>            
    #include <afxwin.h>
    
    // CChartCtrl类的前置声明
    class CChartCtrl;
    class CChartObject  
    {
        friend CChartCtrl;
    public:
        CChartObject(CChartCtrl* pOwner);
        virtual ~CChartObject();
        void SetVisible(bool bVisible);
        bool IsVisible()  const                   { return m_bIsVisible; }
        COLORREF GetColor() const                 { return m_ObjectColor; }
        void SetColor(COLORREF NewColor);
        COLORREF GetShadowColor() const           { return m_ShadowColor; }
        void SetShadowColor(COLORREF NewColor);
        void EnableShadow(bool bEnable);
        void SetShadowDepth(int Depth);
        bool Clip(int& dX, int& dY)  const
        {
            bool bResult = true;
            if (dX>m_ObjectRect.right)
            {
                dX = m_ObjectRect.right;
                bResult = false;
            }
            if (dX<m_ObjectRect.left)
            {
                dX = m_ObjectRect.left;
                bResult = false;
            }
            if (dY>m_ObjectRect.bottom)
            {
                dY = m_ObjectRect.bottom;
                bResult = false;
            }
            if (dY<m_ObjectRect.top)
            {
                dY = m_ObjectRect.top;
                bResult = false;
            }
            return bResult;
        }
    protected:
        void SetRect(CRect NewTect)  { m_ObjectRect = NewTect; }
        
        CRect        m_ObjectRect;       // Size of the object
        COLORREF    m_ObjectColor;       // Color of the objet
        CChartCtrl*    m_pParent;        // Owner of the object
        bool        m_bIsVisible;
        bool        m_bShadow;           // Specifies if the object generate a shadow.
                                         // This is not supported for all objects.
        COLORREF    m_ShadowColor;
        int            m_iShadowDepth;
    private:
        virtual void Draw(CDC* pDC) = 0;
    };
    #endif // !defined(AFX_CHARTOBJECT_H__6ED024F2_00D9_45D5_AB83_258EF0075288__INCLUDED_)

    CChartObject类的源文件。

    #include "stdafx.h"
    #include "ChartCtrl.h"
    CChartObject::CChartObject(CChartCtrl* pOwner)
    {
        m_ObjectRect.left = m_ObjectRect.right = 0;
        m_ObjectRect.top = m_ObjectRect.bottom = 0;
        m_ObjectColor = RGB(0,0,0);
        m_pParent = pOwner;
        m_bIsVisible = true;
        m_bShadow = false;
        m_ShadowColor = RGB(150,150,150);
        m_iShadowDepth = 2;
    }
    CChartObject::~CChartObject()
    {
    }
    void CChartObject::SetVisible(bool bVisible)
    {
        m_bIsVisible = bVisible;
        m_pParent->RefreshCtrl();
    }
    void CChartObject::SetColor(COLORREF NewColor)       
    {
        m_ObjectColor = NewColor;
        m_pParent->RefreshCtrl();
    }
    void CChartObject::SetShadowColor(COLORREF NewColor)
    {
        m_ShadowColor = NewColor;
        m_pParent->RefreshCtrl();
    }
    void CChartObject::EnableShadow(bool bEnable)
    {
        m_bShadow = bEnable;
        m_pParent->RefreshCtrl();
    }
    void CChartObject::SetShadowDepth(int Depth)
    {
        m_iShadowDepth = Depth;
        m_pParent->RefreshCtrl();
    }
    在这份源码中没什么特别难懂且复杂的地方,简单说几个自己觉得值得记录的知识点。
    • 头文件中的#if !defined(……) …… #endif是为了避免当前头文件被二次包含,起到类似功能的还有#ifndef …… #endif。
    • _MSC_VER为Microsoft的C编译器版本,微软不同时期,编译器有不同的版本:
      • Visual C++ 2005 MS VC++8.0   _MSC_VER = 1400
      • Visual C++ 2008 MS VC++9.0   _MSC_VER = 1500
      • Visual C++ 2010 MS VC++10.0 _MSC_VER = 1600
    • 在程序中加入_MSC_VER宏可以根据编译器版本让不同版本的编译器选择性地编译一段程序。查看编译的版本信息,可以在开发工具对应的Command line里敲 cl /?
    • Clip函数用来将函数参数中的位置约束在m_ObjectRect矩形空间内,当该位置在m_ObjectRect矩形空间的时候函数返回值为True;否则,返回False。
    作者:常想一二
    出处:http://www.cnblogs.com/wolfmvp/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Java开源爬虫框架crawler4j
    Java——关于static关键字的那些事总结
    Java——关于static关键字的那些事总结
    Struts2+Hibernate实现图书管理系统
    Struts2+Hibernate实现图书管理系统
    JDBC+Servlet+JSP实现基本的增删改查(简易通讯录)
    JDBC+Servlet+JSP实现基本的增删改查(简易通讯录)
    结合BeautyEye开源UI框架实现的较美观的Java桌面程序
    结合BeautyEye开源UI框架实现的较美观的Java桌面程序
    HTTP和HTTPS详解。
  • 原文地址:https://www.cnblogs.com/wolfmvp/p/7204222.html
Copyright © 2020-2023  润新知