使用DrawText或类似函数渲染下标

时间:2012-02-20 12:44:01

标签: windows delphi fonts rendering c++builder

问题很简单。如何将以下文本绘制到TStringGrid单元格中?

enter image description here

操作系统是Windows XP(或Windows Vista或Windows 7)。首选开发环境是C ++ Builder 6,但我也会接受Delphi的C ++ Builder XE解决方案。首选API函数是DrawText,但如果存在更好的函数,则没有问题。字体名称为Times New Roman,字体大小为11.目前我使用此方法呈现单元格内容(简化):

void __fastcall TForm_Main::StringGrid_DrawCell(TObject *Sender,
  int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
   TStringGrid *grid = (TStringGrid*)Sender;
   if (grid == NULL) return;

   // 1. BACKGROUND
   grid->Canvas->Brush->Color = grid->Color;
   grid->Canvas->FillRect(Rect);

   // 2. TEXT
   grid->Canvas->Font->Assign(grid->Font);   // Times New Roman, 11pt

   // horizontal centering
   RECT RText = static_cast<RECT>(Rect);
   AnsiString text = grid->Cells[ACol][ARow];
   if (!text.IsEmpty()) {
      int text_len = strlen(text.c_str());
      SIZE size;
      memset(&size, 0, sizeof(SIZE));
      GetTextExtentPoint32(grid->Canvas->Handle, text.c_str(), text_len, &size);
      int offset_x = (Rect.Width() - size.cx) >> 1;
      RText.left += offset_x; RText.right += offset_x;

      // rendering
      DrawText(grid->Canvas->Handle, text.c_str(), text_len, &RText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
   }
}

有些字符将下标字形作为特殊的unicode字符(例如代码0x2081分配给下标1)但不幸的是,这不是大写字母U的情况。所有字体都不支持这些字符(例如Times New Roman字体)不支持代码范围0x2070 - 209F),请参阅this维基百科文章。我正在寻找一个更通用的解决方案,如Microsoft Word实现的解决方案。 MS Word使用Times New Roman字体将大写字母U渲染为下标没有问题。

1 个答案:

答案 0 :(得分:0)

`     函数SSTextLeft(ACanvas:TCanvas; ARect:TRect; const S:字符串):整数;

anon_other_write_enable=YES

`