ChartCtrl源码剖析之——CChartGrid类

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(128,128,128);
}
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,0,m_ObjectColor);
    pOldPen = pDC->SelectObject(&NewPen);
    list<int>::iterator iter = m_vecTickPos.begin();
    int ActuPosition = 0;
    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 += 3;
                Clip(ActuX,ActuPosition);
                pDC->LineTo(ActuX,ActuPosition);
                ActuX += 3;
            }
        }
        else
        {
            int ActuY = m_ObjectRect.bottom;
            while (true)
            {
                if (!Clip(ActuPosition,ActuY))
                    break;
                pDC->MoveTo(ActuPosition,ActuY);
                ActuY -= 3;
                Clip(ActuPosition,ActuY);
                pDC->LineTo(ActuPosition,ActuY);
                ActuY -= 3;
            }
        }
    }
    pDC->SelectObject(pOldPen);
    DeleteObject(NewPen);
}

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

 

转载于:https://www.cnblogs.com/wolfmvp/p/7207149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值