设置,即和横向颠倒 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)范围水平上刻度