设为首页 加入收藏

TOP

利用c++实现数值坐标刻度生成,并利用GDI绘制(三)
2016-10-08 11:31:15 】 浏览:1325
Tags:利用 实现 数值 坐标 刻度 生成 GDI 绘制
fontunit.CreatePointFont(120,_T("Times New Roman"),pDC); CPen pen(0,1,rgb),*oldpen; oldpen=pDC->SelectObject(&pen); float posx,posy; oldfont=pDC->SelectObject(&font); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); LONG TW=tm.tmAveCharWidth; // 获取输出字符信息,主要是为了使得短线标注对准字符串中间位置 LONG TH=tm.tmHeight; // 用于计算字符相对短线输出位置 double k=(Desx2-Desx1)/(x2-x1); if(IsUpper==true) // 标注在上边 { pDC->SelectObject(&font); pDC->SetTextAlign(TA_CENTER | TA_BOTTOM); for(int i=0;i MoveTo(posx,Desy1); pDC->LineTo(posx,Desy1-TW); pDC->TextOutW(posx,Desy1-TW-1,xlabelArr.GetAt(i)); } posx=k*((x1+x2)/2.0-x1)+Desx1; pDC->SelectObject(&fontunit); pDC->TextOutW(posx,Desy1-TW-TH,xtitle); // 绘制x方向坐标单位 } else{ // 标注在下边 pDC->SelectObject(&font); pDC->SetTextAlign(TA_CENTER | TA_TOP); for(int i=0;i MoveTo(posx,Desy1); pDC->LineTo(posx,Desy1+TW); pDC->TextOutW(posx,Desy1+TW+1,xlabelArr.GetAt(i)); } posx=k*((x1+x2)/2.0-x1)+Desx1; pDC->SelectObject(&fontunit); pDC->TextOutW(posx,Desy1+TW+TH,xtitle); // 绘制x方向坐标单位 } if(xorder!=0) // 绘制x方向阶次 { CFont font1,font2; 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; // ×10字符和阶次字符 orderstr.Format(_T("%d"),xorder); if(IsUpper==true) { pDC->SelectObject(&font1); pDC->SetTextAlign(TA_BOTTOM | TA_RIGHT); pDC->TextOutW(Desx2-TW/fontrate*2,Desy1-TW-TH,tenstr); pDC->SelectObject(&font2); pDC->SetTextAlign(TA_BOTTOM | TA_LEFT); pDC->TextOutW(Desx2-TW/fontrate*2,Desy1-TW-TH-TH/2.0,orderstr); } else { pDC->SelectObject(&font1); pDC->SetTextAlign(TA_TOP | TA_RIGHT); pDC->TextOutW(Desx2-TW/fontrate*2,Desy1+TW+TH+TH/2.0,tenstr); pDC->SelectObject(&font2); pDC->SetTextAlign(TA_TOP | TA_LEFT); pDC->TextOutW(Desx2-TW/fontrate*2,Desy1+TW+TH,orderstr); } } pDC->SelectObject(oldfont); pDC->SelectObject(oldpen); return true; } bool CLabelDrawer::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,COLORREF rgb) // 绘制垂直刻度 // pDC: 绘图句柄。ylabelnum: 刻度数目。pylabel:刻度真实数值。ylabelArr:刻度数值对应的字符串。 // yorder: 采用科学计数法阶次。Desy1,Desy2:标注绘制在窗口中的纵坐标。Desx1:垂直刻度在窗口中的横坐标。 // ytitle: 坐标轴名称字符串。IsLeft:若为true,刻度位于刻度线左边,否则位于刻度线右边 // rgb:刻度颜色。 { if(abs(Desy2-Desy1)<0.0001) return false; if(pylabel==NULL) return false; pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(rgb); CFont font,fontunit,*oldfont; // 创建Times New Roman字体 font.CreatePointFont(100,_T("Times New Roman"),pDC); fontunit.CreatePointFont(120,_T("Times New Roman"),pDC); CPen pen(0,1,rgb),*oldpen; oldpen=pDC->SelectObject(&pen); float posx,posy; oldfont=pDC->SelectObject(&font); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); LONG TW=tm.tmAveCharWidth; // 获取输出字符信息,主要是为了使得短线标注对准字符串中间位置 LONG TH=tm.tmHeight; // 用于计算字符相对短线输出位置 int charlength=0; for(int i=0;i charlength) charlength=ylabelArr.GetAt(i).GetLength(); } charlength=charlength+1; double k=(Desy2-Desy1)/(y2-y1); if(IsLeft==true) // 标注左边 { pDC->SelectObject(&font); pDC->SetTextAlign(TA_BOTTOM | TA_RIGHT); 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_BOTTOM | TA_CENTER); // 纵向字体按纵向的bottom和left
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【C++研发面试笔记】1. C++常见关.. 下一篇Effective C++ 简要条款分析(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目