问题很简单。如何将以下文本绘制到TStringGrid单元格中?
操作系统是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渲染为下标没有问题。
答案 0 :(得分:0)
` 函数SSTextLeft(ACanvas:TCanvas; ARect:TRect; const S:字符串):整数;
anon_other_write_enable=YES
`