;
if(valueabs>=limitvmax) // 求取最大刻度值大于1000的阶次,正阶
{
while(loop2>=10)
{
loop2=loop2/10;
valueorder++;
}
}else if(valueabs<=limitvmin) // 求取最大刻度值小于0.001的阶次,负阶
{
while(loop2<=0.1)
{
loop2=loop2*10;
valueorder++;
}
}
for(int i=0;i
=limitvmax) // 如果绝对值最大值阶次大于3,则除以对应阶数量级
{
str.Format(_T("%.4f"),label[i]/pow(10.0,valueorder));
}
else if(valueabs<=limitvmin) // 如果绝对值最大值阶次小于-3,则除以对应阶数量级
{
str.Format(_T("%.4f"),label[i]*pow(10.0,valueorder));
}
str=StringCutZeros(str); // 对标注字符串进行尾部去零
labelArr.Add(str);
}
if(valueorder==0) order=0; // 输出阶次
if(endx>=limitvmax) order=valueorder;
if(endx<=limitvmin) order=-valueorder;
return true;
}
CString CLabelGenerator::StringCutZeros(CString str)
// 对标注字符串进行去零处理
{
CString FinalStr;
FinalStr.Empty();
int Length=str.GetLength(); // 字符串长度
int pos=0;
bool IsDot=false;
for(int i=0;i
0) { if(IsDot) FinalStr=str.Left(Length-1-pos); else FinalStr=str.Left(Length-1-(pos-1)); } else FinalStr=str; return FinalStr; }
类中有两个成员函数
boolGenerateLabel(float x1,float x2,int minlabelnum,int &reallabelnum,float*&label,CStringArray &labelArr,int &order,int _interal=0,intlimitorder=3); // 产生坐标刻度
CStringStringCutZeros(CString str); // 对标注字符串进行去零处理
GeneraterLabel函数产生坐标刻度,其中x1,x2是输入的数值,minlabelnum是需要指定的最小刻度个数。如果生成Matlab类似刻度则该数值为4,当然也可以设置其他值。reallabelnum是实际得到刻度个数(注意引用变量,通过引用变量把得到的数据输出),label是该处刻度的数值,labelArr是该处刻度对应的字符串,order是采用科学计数法输出的幂值,_interal是指定刻度值,给定初始值为0,即采用matlab相同刻度。如果不想采用此刻度,可以直接指定_interal值,则会采用指定的刻度生成标注值。Limitorder是指定的科学计数法限制阶数,超过此阶数采用科学计数法。默认为3,即超过1000则采用科学计数法。
StringCutZeros是去除标注字符串尾部的0。因为生成的标注可能尾部有0,如0.3000或1.0。在matlab中就不会出现这样的显示方式。
函数调用:
int xlabelnum;
float *pxlabel;
CStringArray xlabelArr;
int orderx;
CLabelGenerator LabelGenerator;3001,5020
bool sucx=LabelGenerator.GenerateLabel(3001,5020,4,xlabelnum,pxlabel,xlabelArr,orderx); // 产生x刻度和值刻度
if(pxlabel!=NULL) // 清空数组
{
delete m_pxlabel;
pxlabel=NULL;
}
bool sucy=LabelGenerator.GenerateLabel(200001,5340000,5,xlabelnum,pxlabel,xlabelArr,orderx,0,4);
坐标绘制采用GDI编写,被封装成CLabelDrawer类
LabelDrawer.h
#ifndef LABELDRAWER_H
#define LABELDRAWER_H
#pragma once
class CLabelDrawer
{
public:
CLabelDrawer(void);
~CLabelDrawer(void);
public:
bool DrawLabelHor(CDC *pDC,
int xlabelnum,float *pxlabel,CStringArray &xlabelArr,int xorder,
float Desx1,float Desx2,float Desy1,float x1,float x2,CString xtitle,
bool IsUpper=true,COLORREF rgb=RGB(0,0,0));
bool DrawLabelVer(CDC *pDC,
int ylabelnum,float *pylabel,CStringArray &ylabelArr,int yorder,
float Desy1,float Desy2,float Desx1,float y1,float y2,CString ytitle,
bool IsLeft=true,COLORREF rgb=RGB(0,0,0));
};
#endif
LabelDrawer.cpp
//**************************** LabelDrawer.cpp *****************************
// 包含功能:坐标刻度绘制(配合CLabelGenerator类)
//
// 作者: jiangjp2812 1034378054@qq.com
// 单位: 中国地质大学(武汉)
// 日期: 2016/10/01
//**********************************************************************************
#include "StdAfx.h"
#include "LabelDrawer.h"
#include
CLabelDrawer::CLabelDrawer(void)
{
}
CLabelDrawer::~CLabelDrawer(void)
{
}
bool CLabelDrawer::DrawLabelHor(CDC *pDC,
int xlabelnum,float *pxlabel,CStringArray &xlabelArr,int xorder,
float Desx1,float Desx2,float Desy1,float x1,float x2,CString xtitle,
bool IsUpper,COLORREF rgb)
// 绘制水平刻度
// pDC: 绘图句柄。xlabelnum: 刻度数目。pxlabel:刻度真实数值。xlabelArr:刻度数值对应的字符串。
// xorder: 采用科学计数法阶次。Desx1,Desx2:标注绘制在窗口中的横坐标。Desy1:水平刻度在窗口中的纵坐标。
// xtitle: 坐标轴名称字符串。IsUpper:若为true,刻度位于刻度线上方,否则位于刻度线下方
// rgb:刻度颜色。
{
if(abs(Desx2-Desx1) <0.0001) return false;
if(pxlabel==NULL) return false;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(rgb);
CFont font,fontunit,*oldfont; // 创建Times New Roman字体
font.CreatePointFont(100,_T("Times New Roman"),pDC);