首先,做一些简单的铺垫,目前针对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) = ;
};
#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 = ;
m_ObjectRect.top = m_ObjectRect.bottom = ;
m_ObjectColor = RGB(,,);
m_pParent = pOwner;
m_bIsVisible = true;
m_bShadow = false;
m_ShadowColor = RGB(,,);
m_iShadowDepth = ;
}
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。

ChartCtrl源码剖析之——CChartObject类的更多相关文章

  1. ChartCtrl源码剖析之——CChartAxis类

    CChartAxis类用来绘制波形控件的坐标轴,这个源码相对较复杂,当初阅读的时候耗费了不少精力来理解源码中的一些实现细节. CChartAxis类的头文件. #if !defined(AFX_CHA ...

  2. ChartCtrl源码剖析之——CChartTitle类

    CChartTitle类顾名思义,该类用来绘制波形控件的标题,它处于该控件的区域,如下图所示: CChartTitle类的头文件. #if !defined(AFX_CHARTTITLE_H__499 ...

  3. ChartCtrl源码剖析之——CChartScrollBar类

    CChartScrollBar类用来针对每个轴的数据进行滚动,将那些不在当前区域内的数据通过滚动展示出来. CChartScrollBar类的头文件. #pragma once class CChar ...

  4. ChartCtrl源码剖析之——CChartAxisLabel类

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

  5. ChartCtrl源码剖析之——CChartLegend类

    CChartLegend类用来绘制每一个波形的描述信息,它处于该控件的区域,如下图所示: CChartLegend类的头文件. #if !defined(AFX_CHARTLEGEND_H__CD72 ...

  6. ChartCtrl源码剖析之——CChartGrid类

    CChartGrid类用来绘制波形区域中的表格,当绘制波形时波形就显示在这些表格上面.它处于该控件的区域,如下图所示: CChartGrid类的头文件. #if !defined(AFX_CHARTG ...

  7. PART(Persistent Adaptive Radix Tree)的Java实现源码剖析

    论文地址 Adaptive Radix Tree: https://db.in.tum.de/~leis/papers/ART.pdf Persistent Adaptive Radix Tree: ...

  8. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  9. WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore

    影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...

随机推荐

  1. 点评阿里JAVA手册之编程规约(OOP 规约 、集合处理 、并发处理 、其他)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为三星(★★★) 本文为第二篇 第一篇 点评阿里JAVA手 ...

  2. 利用 os.walk() 遍历目录

    os.walk: walk(top, topdown=True, onerror=None, followlinks=False) 参数: top 要遍历的目录地址 topdown 为真,则优先遍历t ...

  3. Wampserver红色橙色解决思路----端口冲突是关键

    Wampserver不是绿色:wampserver下载安装不需要配置环境,在这之前需要下载tomcat,并确保启动,不然会是红色.安装好wampserver(就是在安装过程不会弹出缺少什么文件,我的就 ...

  4. 热部署环境下,dubbo序列化的bug和优化

    一.问题的发现与解决 (1)     在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException. 最后发现原因是我们的框架选择使用了java序列 ...

  5. android Activity Application Context 的区别

    用了这么久的Context,对于Context究竟是个什么玩意一直不是很明白.看了网上十几篇文章的介绍 加上自己的理解总结一下.(自己想法,不对勿喷,不想照搬网上一些文字说法来糊弄自己,自己理解的就这 ...

  6. win10 搜索不能使用解决方法

    重装系统之后遇到一个问题,在搜索栏不能搜索到应用程序,Windows 10 Search can't find ANY applications. Even calculator - Super Us ...

  7. python 标准库 -- os

    os os.getcwd() os.getcwd() # 获取当前工作目录 os.listdir(path) os.listdir('/tmp') # 列出指定目录下的文件和目录 os.mkdir(p ...

  8. Linux命令 用户管理命令

    groupadd [功能说明] 新建用户组 [语法格式] Groupadd[-f][-r][-g<GID><-o>][组名] [选项参数] 参数 说明 -f 建立已存在的组,强 ...

  9. MongoDB 3.4版本, C# 驱动 2.4 操作

    private static string _connStr = "mongodb://127.0.0.1:27017"; private static string _dbNam ...

  10. java中byte, iso-8859-1, UTF-8,乱码的根源

    Post@https://ryan-miao.github.io 背景 还是多语言, 在项目中遇到本地环境和服务端环境不一致乱码的情形.因此需要搞清楚乱码产生的过程,来分析原因. 获取多语言代码如下: ...