设为首页 加入收藏

TOP

利用c++实现数值坐标刻度生成,并利用GDI绘制(五)
2016-10-08 11:31:15 】 浏览:1327
Tags:利用 实现 数值 坐标 刻度 生成 GDI 绘制
设置,即和横向颠倒 posy=k*((y1+y2)/2.0-y1)+Desy1; LOGFONT logfont; fontunit.GetLogFont(&logfont); logfont.lfEscapement =900; CFont fontemp; fontemp.CreateFontIndirect(&logfont); pDC->SelectObject(&fontemp); pDC->TextOutW(Desx1-TW*charlength-TW,posy,ytitle); } else{ pDC->SelectObject(&font); pDC->SetTextAlign(TA_BOTTOM | TA_LEFT); for(int i=0;i MoveTo(Desx1,posy); pDC->LineTo(Desx1+TW,posy); pDC->TextOutW(Desx1+TW+1,posy+TH/2.0,ylabelArr.GetAt(i)); } pDC->SetTextAlign(TA_TOP | TA_CENTER); posy=k*((y1+y2)/2.0-y1)+Desy1; LOGFONT logfont; fontunit.GetLogFont(&logfont); logfont.lfEscapement =900; CFont fontemp; fontemp.CreateFontIndirect(&logfont); pDC->SelectObject(&fontemp); pDC->TextOutW(Desx1+TW*charlength+TW,posy,ytitle); } if(yorder!=0) { CFont font1,font2; // 创建Times New Roman字体 font1.CreatePointFont(100,_T("Times New Roman"),pDC); font2.CreatePointFont(70,_T("Times New Roman"),pDC); float fontrate=100.0/70.0; CString tenstr("×10"),orderstr; orderstr.Format(_T("%d"),yorder); if(IsLeft==true) { pDC->SelectObject(&font1); pDC->SetTextAlign(TA_BOTTOM | TA_RIGHT); pDC->TextOutW(Desx1-charlength*TW-TW-TW/fontrate*2,Desy2,tenstr); pDC->SelectObject(&font2); pDC->SetTextAlign(TA_BOTTOM | TA_LEFT); pDC->TextOutW(Desx1-charlength*TW-TW-TW/fontrate*2,Desy2-TH/2.0,orderstr); } else { pDC->SelectObject(&font1); pDC->SetTextAlign(TA_BOTTOM | TA_LEFT); pDC->TextOutW(Desx1+charlength*TW+TW,Desy2,tenstr); pDC->SelectObject(&font2); pDC->SetTextAlign(TA_BOTTOM | TA_LEFT); pDC->TextOutW(Desx1+charlength*TW+TW+(tenstr.GetLength()+1)*TW,Desy2-TH/2.0,orderstr); } } pDC->SelectObject(oldfont); pDC->SelectObject(oldpen); return true; }

CLabelDrawer类中有两个成员函数,DrawLabelHor用于绘制水平刻度,DrawLabelVer用于绘制垂直刻度。函数参数在代码中有说明,这个类必须配合上边的CLabelGenerator类使用。下面是使用实例。

首先利用vs生成一个MFC单文档程序,为了方便说明,直接把数据放在了OnDraw函数中:

void CLabelTestView::OnDraw(CDC* pDC)
{
	CLabelTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码

    int labelnum;
    float *plabel=NULL;
    CStringArray labelArr;
    int order;

    float v1=-0.0005,v2=-0.0003;
    float Desx1=100,Desx2=500,Desy1=100,Desy2=500;
    // 生成数值(-0.0005 -0.0003)范围
    CLabelGenerator labelgen;
    labelgen.GenerateLabel(v1,v2,4,labelnum,plabel,labelArr,order);

    CLabelDrawer labeldraw;
    // 绘制数值(-0.0005 -0.0003)范围上刻度
    labeldraw.DrawLabelHor(pDC,labelnum,plabel,labelArr,order,Desx1,Desx2,Desy1,v1,v2,_T("upper label"));
    // 绘制数值(-0.0005 -0.0003)范围下刻度
    labeldraw.DrawLabelHor(pDC,labelnum,plabel,labelArr,order,Desx1,Desx2,Desy2,v1,v2,_T("lower label"),false,RGB(0,0,255));
    // 绘制数值(-0.0005 -0.0003)范围左刻度
    labeldraw.DrawLabelVer(pDC,labelnum,plabel,labelArr,order,Desy1,Desy2,Desx1,v1,v2,_T("left label"));
    // 绘制数值(-0.0005 -0.0003)范围右刻度
    labeldraw.DrawLabelVer(pDC,labelnum,plabel,labelArr,order,Desy1,Desy2,Desx2,v1,v2,_T("right label"),false,RGB(255,0,0));
    //  绘制矩形框
    pDC->SelectStockObject(NULL_BRUSH);
    pDC->Rectangle(Desx1,Desy1,Desx2,Desy2);
 
    v1=30; v2=803;
    Desx1=650;Desx2=950;Desy1=100;Desy2=500;
    if(plabel!=NULL)  delete plabel;
    // 绘制数值(30 803)范围刻度
    labelgen.GenerateLabel(v1,v2,5,labelnum,plabel,labelArr,order);       
    // 绘制数值(30 803)范围水平上刻度
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【C++研发面试笔记】1. C++常见关.. 下一篇Effective C++ 简要条款分析(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目