Я могу измерить размеры текста с помощью DirectWrite для существующего IDWriteTextFormat
:
CComPtr<IDWriteTextLayout> lay = 0;
pWriteFactory->CreateTextLayout(txt, (UINT32)wcslen(txt), TextFormat, 1000, 1000, &lay);
DWRITE_TEXT_METRICS m = { 0 };
lay->GetMetrics(&m);
Теперь, есть ли способ сделать обратное? В данном прямоугольнике выясните, как бы я вызвал pWriteFactory->CreateTextFormat()
(что передать в качестве размера шрифта), чтобы текст помещался в этот прямоугольник без переноса.
В настоящее время мой единственный способ - это оценить его вручную:
float TextValueForRect(D2F Fit, LOGFONT& lf, const wchar_t* txt, UINT32 ly)
{
DWRITE_FONT_STYLE fst = DWRITE_FONT_STYLE_NORMAL;
if (lf.lfItalic)
fst = DWRITE_FONT_STYLE_ITALIC;
DWRITE_FONT_STRETCH fsr = DWRITE_FONT_STRETCH_NORMAL;
auto we = lf.lfWeight > 500 ? DWRITE_FONT_WEIGHT_BOLD : DWRITE_FONT_WEIGHT_NORMAL;
FLOAT fs = 500.0f;
D2D1_POINT_2F Bounds = { 0,1000.0f };
for (int t = 0; t < 20; t++)
{
CComPtr<IDWriteTextFormat> Text;
WriteFa->CreateTextFormat(lf.lfFaceName, 0, we, fst, fsr, fs, L"", &Text);
auto tu = MeasureString(WriteFa, Text, txt, ly);
if (std::get<0>(tu) < Fit.Width() && std::get<1>(tu) < Fit.Height())
{
// Enlarge font
Bounds.x = fs;
fs = Bounds.x + (Bounds.y - Bounds.x) / 2.0f;
}
else
if (std::get<0>(tu) > Fit.Width() || std::get<1>(tu) > Fit.Height())
{
// Smallen font
Bounds.y = fs;
fs = Bounds.x + (Bounds.y - Bounds.x) / 2.0f;
}
}
return (Bounds.y + Bounds.x) / 2.0f;
}
Большое спасибо