CChartTitle类顾名思义,该类用来绘制波形控件的标题,它处于该控件的区域,如下图所示:

CChartTitle类的头文件。

#if !defined(AFX_CHARTTITLE_H__49972787_6D28_4F81_A12F_420947456913__INCLUDED_)
#define AFX_CHARTTITLE_H__49972787_6D28_4F81_A12F_420947456913__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ChartObject.h"
#include <vector>
#include "ChartString.h"
class CChartTitle : public CChartObject
{
friend CChartCtrl;
public:
size_t GetStringCount() const;
TChartString GetString(size_t Index) const;
void AddString(const TChartString& NewString);
void RemoveAll();
void SetFont(int iPointSize, const TChartString& strFaceName);
CChartTitle(CChartCtrl* pParent);
virtual ~CChartTitle();
private:
CSize GetSize(CDC* pDC);
void Draw(CDC *pDC);
std::vector<TChartString> m_StringArray;
TChartString m_strFontName;
int m_iFontSize;
};
#endif // !defined(AFX_CHARTTITLE_H__49972787_6D28_4F81_A12F_420947456913__INCLUDED_)

其中,ChartString.h头文件。

#pragma once
#include <string>
#if defined _UNICODE || defined UNICODE
typedef std::wstring TChartString;
#else
typedef std::string TChartString;
#endif

CChartTitle类的源文件。

#include "stdafx.h"
#include "ChartTitle.h"
#include "ChartCtrl.h"
#include "Math.h"
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CChartTitle::CChartTitle(CChartCtrl* pParent) : CChartObject(pParent)
{
m_ObjectColor = RGB(,,);
m_iFontSize = ;
m_strFontName = _T("Microsoft Sans Serif");
}
CChartTitle::~CChartTitle()
{
}
void CChartTitle::SetFont(int iPointSize, const TChartString& strFaceName)
{
m_iFontSize = iPointSize;
m_strFontName = strFaceName;
m_pParent->RefreshCtrl();
}
void CChartTitle::AddString(const TChartString& NewString)
{
m_StringArray.push_back(NewString);
m_pParent->RefreshCtrl();
}
size_t CChartTitle::GetStringCount() const
{
return m_StringArray.size();
}
TChartString CChartTitle::GetString(size_t Index) const
{
if ( (Index<) || (Index>=m_StringArray.size()) )
return _T("");
return m_StringArray[Index];
}
void CChartTitle::RemoveAll()
{
m_StringArray.clear();
m_pParent->RefreshCtrl();
}
void CChartTitle::Draw(CDC *pDC)
{
if (!pDC->GetSafeHdc())
return;
if (!m_bIsVisible)
return;
CFont* pOldFont;
CFont NewFont;
NewFont.CreatePointFont(m_iFontSize,m_strFontName.c_str(),pDC);
COLORREF OldColor = pDC->SetTextColor(m_ObjectColor);
pOldFont = pDC->SelectObject(&NewFont);
int iPrevMode = pDC->SetBkMode(TRANSPARENT);
//Draw all entries
int YPos = ;
size_t TitleCount = m_StringArray.size();
for (size_t i=;i<TitleCount;i++)
{
//Draw Text
int TextWidth = pDC->GetTextExtent(m_StringArray[i].c_str()).cx;
int TextHeigh = pDC->GetTextExtent(m_StringArray[i].c_str()).cy;
int XPos = m_ObjectRect.left + (int)fabs((m_ObjectRect.left-m_ObjectRect.right)/2.0) - TextWidth/;
if (m_bShadow)
{
pDC->SetTextColor(m_ShadowColor);
pDC->ExtTextOut(XPos+m_iShadowDepth,m_ObjectRect.top+YPos+m_iShadowDepth,
ETO_CLIPPED,NULL,m_StringArray[i].c_str(),NULL);
pDC->SetTextColor(m_ObjectColor);
}
pDC->ExtTextOut(XPos,m_ObjectRect.top+YPos,ETO_CLIPPED,NULL,m_StringArray[i].c_str(),NULL);
YPos += TextHeigh + ;
}
pDC->SelectObject(pOldFont);
DeleteObject(NewFont);
pDC->SetTextColor(OldColor);
pDC->SetBkMode(iPrevMode);
}
CSize CChartTitle::GetSize(CDC *pDC)
{
CSize TitleSize;
if (!m_bIsVisible)
{
TitleSize.cx = TitleSize.cy = ;
return TitleSize;
}
int Height = ; //Upper space
CSize TextSize = ;
int MaxTextWidth = ;
size_t TitleCount = m_StringArray.size();
if (TitleCount==)
{
TitleSize.cx = TitleSize.cy = ;
return TitleSize;
}
CFont* pOldFont;
CFont NewFont;
NewFont.CreatePointFont(m_iFontSize,m_strFontName.c_str(),pDC);
pOldFont = pDC->SelectObject(&NewFont);
for (size_t i=;i<TitleCount;i++)
{
TextSize = pDC->GetTextExtent(m_StringArray[i].c_str());
Height += TextSize.cy + ;
if (TextSize.cx > MaxTextWidth)
MaxTextWidth = TextSize.cx;
}
TitleSize.cx = MaxTextWidth + ;
TitleSize.cy = Height;
m_ObjectRect.bottom = m_ObjectRect.top + Height;
pDC->SelectObject(pOldFont);
DeleteObject(NewFont);
return TitleSize;
}

GetSize函数用来获取标题文字的长度和宽度,Draw函数用来在指定位置绘制标题文字。在初次阅读这份源码的时候在如何确定m_ObjectRect大小的时候纠结了很长时间,现在读的时候感觉无比顺畅,真是应了那句古话,书读百遍其义自现,代码读个三五遍,一开始读不懂的统统全部拿下,感觉特别Happy。

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

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

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

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

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

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

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

  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. MTK andorid从底层到上层添加驱动

    1 [编写linux驱动程序] 1.1 一.编写驱动核心程序 1.2 二.配置Kconfig 1.3 三.配置Makefile 1.4 四.配置系统的autoconfig 1.5 五.编译 2 [编写 ...

  2. 洛谷P3094 [USACO13DEC]假期计划Vacation Planning

    题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...

  3. 深入理解计算机操作系统——第11章:全球IP英特网

    全球IP英特网 (1)每台英特网主机都运行实现TCPIP协议的软件. (2)英特网的客户端和服务器混合使用套接字接口函数和Unix IO函数来进行通信. (3)套接字函数典型的是作为陷入内核的系统调用 ...

  4. AS3实现ToolTip效果

    AS3核心类中没有ToolTip类,Flex中的ToolTip类没法用在AS3工程中,Aswing的JToolTip不错,不过如果仅仅为了使用这一个类而导入Aswing就不太明智了.由于最近的项目需要 ...

  5. ArcGIS10.x Engine直连提示连接超时ORA-12170 来自:http://www.iarcgis.com/?p=1004

    导语 随着Esri大力宣传直连,用户也越来越由服务连接,改为直连,当然ArcGIS Engine开发用户也不例外. 环境 Oracle数据库,ArcGIS版本不限,不过由于9版本多以服务连接,以10版 ...

  6. Defcon 23最新开源工具NetRipper代码分析与利用

    0×01 研究背景 在分析了俄罗斯人被曝光的几个银行木马的源码后,发现其大多均存在通过劫持浏览器数据包来获取用户个人信息的模块,通过截获浏览器内存中加密前或解密后的数据包来得到数据包的明文数据.在De ...

  7. 解决Win7 64bit + VS2013 使用opencv时出现提“应用程序无法正常启动(0xc000007b)”错误

    应用程序无法正常启动(0xc000007b) 记得以前也遇到过这样的问题:网上的解决方法就是修复什么 今天配置opencv2.4.8+vs2013的时候,发现用老版本的程序是不是都会出现这样的现象啊! ...

  8. 巧用Drawable 实现Android UI 元素间距效果

    源文地址: 巧用Drawable 实现Android UI 元素间距效果 在大部分的移动UI或者Web UI都是基于网格概念而设计的.这种网格一般都是有一些对其的方块组成,然后它们组合成为一个块.使用 ...

  9. win8 metro 自己写摄像头录像项目

    这是要求不适用CameraCaptureUI等使用系统自带的 camera  UI界面.要求我们自己写调用摄像头摄像的方法,如今我把我的程序贴下: UI界面的程序: <Page x:Class= ...

  10. Linux下获取线程TID的方法

    如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: fi ...