CChartGrid类用来绘制波形区域中的表格,当绘制波形时波形就显示在这些表格上面。它处于该控件的区域,如下图所示:

CChartGrid类的头文件。

#if !defined(AFX_CHARTGRID_H__ECCBEFF4_2365_49CD_A865_F1B4DD8CA138__INCLUDED_)
#define AFX_CHARTGRID_H__ECCBEFF4_2365_49CD_A865_F1B4DD8CA138__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ChartObject.h"
#include <list>
class CChartAxis;
class CChartGrid : public CChartObject
{
friend CChartAxis;
public:
CChartGrid(CChartCtrl* pParent, bool bHoriz);
virtual ~CChartGrid();
private:
void Draw(CDC* pDC);
void AddTick(int Position);
void ClearTicks();
std::list<int> m_vecTickPos;
bool m_bIsHorizontal;
};
#endif // !defined(AFX_CHARTGRID_H__ECCBEFF4_2365_49CD_A865_F1B4DD8CA138__INCLUDED_)

CChartGrid类的源文件。

#include "stdafx.h"
#include "ChartGrid.h"
#include "ChartAxis.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CChartGrid::CChartGrid(CChartCtrl* pParent, bool bHoriz)
: CChartObject(pParent), m_bIsHorizontal(bHoriz), m_vecTickPos()
{
m_ObjectColor = RGB(,,);
}
CChartGrid::~CChartGrid()
{
}
void CChartGrid::AddTick(int Position)
{
m_vecTickPos.push_back(Position);
}
void CChartGrid::ClearTicks()
{
m_vecTickPos.clear();
}
void CChartGrid::Draw(CDC *pDC)
{
if (!m_bIsVisible)
return;
if (!pDC->GetSafeHdc() )
return;
CPen* pOldPen;
CPen NewPen(PS_SOLID,,m_ObjectColor);
pOldPen = pDC->SelectObject(&NewPen);
list<int>::iterator iter = m_vecTickPos.begin();
int ActuPosition = ;
for (iter; iter!=m_vecTickPos.end(); iter++)
{
ActuPosition = *iter;
if (!m_bIsHorizontal)
{
int ActuX = m_ObjectRect.left;
while (true)
{
if (!Clip(ActuX,ActuPosition))
break;
pDC->MoveTo(ActuX,ActuPosition);
ActuX += ;
Clip(ActuX,ActuPosition);
pDC->LineTo(ActuX,ActuPosition);
ActuX += ;
}
}
else
{
int ActuY = m_ObjectRect.bottom;
while (true)
{
if (!Clip(ActuPosition,ActuY))
break;
pDC->MoveTo(ActuPosition,ActuY);
ActuY -= ;
Clip(ActuPosition,ActuY);
pDC->LineTo(ActuPosition,ActuY);
ActuY -= ;
}
}
}
pDC->SelectObject(pOldPen);
DeleteObject(NewPen);
}

这里简单说一下,m_bIsHorizontal用来表示轴的水平与垂直,一开始对这个地方的理解有偏差,当为垂直轴的时候死活没办法理解为什么要累加ActuX的值,因为这明明是横向的嘛。后来意识到绘制的是跟纵轴相关的时候,这个地方就特别好理解了。

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

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

    首先,做一些简单的铺垫,目前针对ChartCtrl源码的剖析只针对V.15版本.名义上说是剖析,倒不如说是记录下自己针对该控件的理解,非常感谢Cedric Moonen大神,一切的功劳与掌声都该赠予给 ...

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

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

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

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

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

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

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

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

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

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

  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. 【ZJOI2017 Round1练习&BZOJ4765】D1T3 普通计算姬(主席树,分块)

    题意: 思路:分块 使用树状数组维护sum[i]的前缀和 使用主席树维护root到u的路径上点的编号出现的个数 每次操作如果是修改就加入队列 如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使 ...

  2. BZOJ2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

    n<=50000个点的树,求选最多不相邻点的个数. f[i][0]=sigma max(f[j][0],f[j][1]),j为i的儿子 f[i][1]=sigma f[j][0],j同上 死于未 ...

  3. 分享一下然让显卡满血复活的小技巧(GTX)

    分享一下然让显卡满血复活的小技巧 笔者在玩大型游戏卡顿15fps下载如下操作 GTX950玩大型游戏都不会卡帧率稳定在30fps 下载GeForce Experience下载更新最新驱动 下载如下程序 ...

  4. 简论远程通信(RPC,Webservice,RMI,JMS的区别)

    RPC(Remote Procedure Call Protocol)RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成“cla ...

  5. SHELL脚本实现分区

    写一个脚本(前提:请为虚拟机新增一块硬盘,架设它为/dev/sdb),为指定的硬盘创建分区 1,列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本:如果用户选择错误,就让用户重新选择 2 ...

  6. foobar2000播放dff格式音乐的解决办法

    安装dff插件:http://www.foobar2000.org/components/view/foo_input_dsdiff 离线版本:链接:http://pan.baidu.com/s/1e ...

  7. 【Arcgis Server】程序动态发布MXD到Arcgis Server

    http://dkay.blogbus.com/logs/47727282.html protected void Button14_Click(object sender, EventArgs e) ...

  8. ArcGIS Engine 10.2 如何发布服务

    http://blog.csdn.net/arcgis_all/article/details/17376397 1 ArcGIS Engine 10.2 如何发布服务 ArcGIS Engine的代 ...

  9. 【APUE】进程间通信之共享存储(mmap函数)

    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...

  10. 在开发过程中,如何在手机上测试vue-cli构建的项目

    由于有时候谷歌手机调试与真是的手机环境还是有一定的差距,所以需要在手机上测试项目. 手机上测试vue-cli构建项目方法: 打开项目config/index.js文件,找到module.exports ...