设为首页 加入收藏

TOP

利用c++实现数值坐标刻度生成,并利用GDI绘制(二)
2016-10-08 11:31:15 】 浏览:1326
Tags:利用 实现 数值 坐标 刻度 生成 GDI 绘制
; 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);
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【C++研发面试笔记】1. C++常见关.. 下一篇Effective C++ 简要条款分析(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目