显示上标与下标的函数

转载 2013年12月02日 19:04:55

显示上标与下标的函数

分类: VC++技巧 3189人阅读 评论(1) 收藏 举报

参考连接:http://www.codeproject.com/useritems/SSTextOut.asp

示例图:

函数名称为SSTextOut,和ExtTextOut函数功能相似。需要指定设备上下文指针,绘制文本区域的指针,需要显示的字符串以及显示格式。

字符串需要包含特殊格式字符。用'^'代表上标,用'_'代表下标,这样,在'^'和'_'后的字符将分别被显示为上标和下标。如果需要显示的是'^'和'_'字符本身,那么将它们连续显示两次就可以。即分别用'^^'和'__'表示。

调用方法:SSTextOut(pDC,"ms^2/Hz+H_2O-mc^^2__4",&rect,DT_CENTER);

源代码:

void SSTextOut(CDC* pDC, CString data , CRect* drawRect, int justification)
{

 //Neccessary initializations

 pDC->SaveDC();
 
 CSize sz;
 CRect outRect(0,0,0,0);

 CFont* pFont = pDC->GetCurrentFont();
 CFont* oldFont;
 pDC->SetTextAlign(TA_BOTTOM|TA_LEFT);

 LOGFONT lf;
 pFont->GetLogFont(&lf);

 CPoint sub,sup,subofs,supofs;

 // Calculate subscript/superscript size and offsets
 sub.x=lf.lfWidth/2;
 sup.x=lf.lfWidth/2;
 sub.y=lf.lfHeight/3*2;
 sup.y=lf.lfHeight/3*2;

 subofs.x=lf.lfWidth/2;
 supofs.x=lf.lfWidth/2;
 subofs.y=lf.lfHeight/6;
 supofs.y=lf.lfHeight/3;

 lf.lfWidth=sub.x;
 lf.lfHeight=sub.y;
 CFont SubFont;
 SubFont.CreateFontIndirect(&lf);
 
 lf.lfWidth=sup.x;
 lf.lfHeight=sup.y;
 CFont SupFont;
 SupFont.CreateFontIndirect(&lf);
 
 CString temp = data;
 TCHAR c;
 
 // Calculate the size of the text that needs to be displayed

 do
 {
  int x=0;
  CString s = "";
  c=' ';
  bool bFind=true;

  // Find the first "^" or "_", indicating the sub- or superscript
  while (bFind)
  {
   x=data.FindOneOf("^_");
   if (x==-1)
   {
    bFind=false;
    x=data.GetLength();
   }
   else if (x==data.GetLength()-1) bFind=false;
   else if (data[x]!=data[x+1])
   {
    bFind=false;
    c=data[x];
   }
   else x++;
   s=s+data.Left(x);
   data.Delete(0,min(x+1,data.GetLength()));
  }
  sz = pDC->GetTextExtent(s);
  outRect.right+=sz.cx;
  if (outRect.Height()<sz.cy) outRect.top=outRect.bottom-sz.cy;
 
  switch (c)
  {
  case '^':
   oldFont = pDC->SelectObject(&SupFont);
   sz = pDC->GetTextExtent(data[0]);
   outRect.right+=sz.cx+supofs.x;
   data.Delete(0);
   pDC->SelectObject(oldFont);
   break;
  case '_':
   oldFont = pDC->SelectObject(&SubFont);
   sz = pDC->GetTextExtent(data[0]);
   outRect.right+=sz.cx+subofs.x;
   data.Delete(0);
   pDC->SelectObject(oldFont);
   break;
  }
 }
 while (c!=' ');
 
 // Adjust text position
 outRect.bottom+=2*subofs.y;
 outRect.top-=2*subofs.x;
 CPoint Origin;
 Origin.y = drawRect->Height()/2+outRect.Height()/2+drawRect->top;

 switch (justification)
 {
 case DT_CENTER:
  Origin.x = drawRect->Width()/2-outRect.Width()/2+drawRect->left;
  break;
 case DT_LEFT:
  Origin.x = drawRect->left;
  break;
 case DT_RIGHT:
  Origin.x = drawRect->right-outRect.Width();
 }

 CPoint pnt = Origin;

 data = temp;

 // Draw text
 do
 {
  int x=0;
  CString s = "";
  c=' ';
  bool bFind=true;

  // Find the first "^" or "_", indicating the sub- or superscript

  while (bFind)
  {
   x=data.FindOneOf("^_");
   if (x==-1)
   {
    bFind=false;
    x=data.GetLength();
   }
   else if (x==data.GetLength()-1) bFind=false;
   else if (data[x]!=data[x+1])
   {
    bFind=false;
    c=data[x];
   }
   else x++;
   s=s+data.Left(x);
   data.Delete(0,min(x+1,data.GetLength()));
  }
  // Draw main text
  pDC->ExtTextOut(pnt.x,pnt.y,ETO_CLIPPED,drawRect,s,NULL);
  sz = pDC->GetTextExtent(s);
  pnt.x+=sz.cx;
 
  // Draw subscript or superscript
  switch (c)
  {
  case '^':
   oldFont = pDC->SelectObject(&SupFont);
   pDC->ExtTextOut(pnt.x+supofs.x,pnt.y-supofs.y,ETO_CLIPPED,drawRect,data[0],NULL);
   sz = pDC->GetTextExtent(data[0]);
   pnt.x+=sz.cx+supofs.x;
   data.Delete(0);
   pDC->SelectObject(oldFont);
   break;
  case '_':
   oldFont = pDC->SelectObject(&SubFont);
   pDC->ExtTextOut(pnt.x+subofs.x,pnt.y+subofs.y,ETO_CLIPPED,drawRect,data[0],NULL);
   sz = pDC->GetTextExtent(data[0]);
   pnt.x+=sz.cx+supofs.x;
   data.Delete(0);
   pDC->SelectObject(oldFont);
   break;
  }
 }
 while (c!=' ');

 // Done, restoring the device context
 pDC->RestoreDC(-1);

}

matlab 坐标修改gca及Matlab中输入上标、下标、希腊字母,特殊符号或字体

1、坐标轴删除 set(gca,'xtick',[])%去掉x轴的刻度 set(gca,'ytick',[]) %去掉xy轴的刻度 set(gca,'xtick',[],'ytick',[])...
  • wenyusuran
  • wenyusuran
  • 2014年09月17日 10:33
  • 2417

word上标下标的快捷键

下标为ctrl+=  以下摘自  http://tech.163.com/05/1212/10/24P09GJN00091NGR.html  常用快捷键  快捷键          作用  C...
  • cloudeagle_bupt
  • cloudeagle_bupt
  • 2013年12月01日 14:59
  • 988

Android TextView设置个别字体样式,上下标

摘抄至:http://blog.sina.com.cn/s/blog_9f233c0701012rdj.html 印象中的TextView:       TextView 就是用于显示文本的控件,...
  • mxbhxx
  • mxbhxx
  • 2014年06月19日 15:47
  • 3753

【转】Latex参考文献上标和插入顺…

Latex参考文献上标和插入顺序 想要是插入的参考文献安装插入顺序而不是作者姓名顺序排序,只要设置bibliographystyle为...
  • kayneo
  • kayneo
  • 2017年06月09日 14:46
  • 358

【Word上标下标】Word上标下标的设置方法及其快捷键

上标下标在数学中是应用最广泛的,平方立方的符号就是上标,而很多数学表达式都有用到上标和下标。在编辑Word文档的过程中,我们也可以利用上标下标来对某些内容进行标注。现在我们就不禁要问,Word中的上标...
  • meng1021
  • meng1021
  • 2014年11月04日 21:33
  • 298

Silverlight如何显示、输入上标和下标?

这是我最近碰到的一个问题,困扰了许久,在网上找了许久,最后在License的帮助下解决了这个问题 http://www.cnblogs.com/akwwl/archive/2012/08/12/...
  • huyanliang
  • huyanliang
  • 2013年05月23日 10:26
  • 661

公式的上下标在MathType中该如何对齐

理工科的公式中带有上下标是非常普遍的,在用MathType对齐公式的各个部份时有时会出现上标与下标不对齐的情况,那么这种问题在MathType数学公式编辑器中是否可以避免呢?我们该如何解决这个问题呢?...
  • cjmarketingeric
  • cjmarketingeric
  • 2015年08月19日 10:29
  • 875

在Rviz中显示坐标系方法探究

这个问题也算是一个历史遗留问题,之前在youbot的机械臂的夹子间添加了一个virtual joint,也算是添加一个坐标系了。但这个偏重于机器人模型方面的坐标。另外,在做机械臂的轨迹运动规划的时候,...
  • yaked
  • yaked
  • 2016年11月01日 16:42
  • 2193

WPF应用 - 实现可上下标的文本框

System.Windows.Controls.RichTextBox首先考虑使用这个控件上下标设置var textrange = new TextRange(rtb.Selection.Start,...
  • wujingang
  • wujingang
  • 2017年05月08日 21:18
  • 386

ArcGIS标注技巧(上标、下标等)

一、方法一 在利用ArcGIS进行制图时,进行标注(Label)或注记(Annotation)是必不可少的。但是除了常规的标注和注记以外,还时常需要一些特殊的标注或注记,比如上标、下标等。其实,A...
  • yh0503
  • yh0503
  • 2015年05月22日 17:00
  • 3017
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:显示上标与下标的函数
举报原因:
原因补充:

(最多只允许输入30个字)