我正在使用RAD Studio XE7。在几个项目中,我使用公共代码来获取文本周围的边框(以像素为单位),使用GDI + MeasureString函数:
// configure the font to use. NOTE be careful, the SVG font size matches with the
// GDI font HEIGHT property, and not with the font SIZE
std::auto_ptr<TFont> pTextFont(new TFont());
pTextFont->Name = fontFamily;
pTextFont->Height = -fontSize;
std::auto_ptr<Gdiplus::Font> pFont(new Gdiplus::Font(pCanvas->Handle, pTextFont->Handle));
// char range is required to extract the first char bounds
Gdiplus::CharacterRange charRange;
charRange.First = 0;
charRange.Length = 1;
// configure the text format
std::auto_ptr<Gdiplus::StringFormat> pTextFormat(new Gdiplus::StringFormat());
pTextFormat->SetAlignment(Gdiplus::StringAlignmentNear);
pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear);
pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);
pTextFormat->SetTrimming(Gdiplus::StringTrimmingNone);
pTextFormat->SetMeasurableCharacterRanges(1, &charRange);
Gdiplus::RectF boundingBox;
Gdiplus::RectF viewBoxF(viewBox);
// measure the rect surrounding the text
if (pGraphics->MeasureString(text.c_str(), text.length(), pFont.get(), viewBoxF,
pTextFormat.get(), &boundingBox) != Gdiplus::Ok)
{
// error is handled here
}
这个函数在几种情况下效果很好,但是有时MeasureString会莫名其妙地失败,将InvalidParameter作为错误消息返回,例如字体参数如下:
pTextFont->Name = L"Courier";
pTextFont->Height = -16;
我首先想到的可能是字体后备问题。我尝试实现以下解决方案以获取后备字体:How to automatically choose most suitable font for different language?
然而,这并没有解决我的问题:
有人可以向我解释我做错了什么?
答案 0 :(得分:0)
与我的想法相反,GDI + 不支持所有已安装的字体,如DrawString函数备注(https://msdn.microsoft.com/en-us/library/windows/desktop/ms535991(v=vs.85).aspx)中所述:
请注意,GDI +不支持PostScript字体或OpenType字体 没有TrueType轮廓。
似乎Courier字体属于那种不能使用的字体&#34;因为&#34;与GDI +。因此,如果我的绘图因GDI +失败,我需要使用GDI,或者提供替换字体。