Реверс DirectWrite GetMetrics - PullRequest
0 голосов
/ 01 мая 2020

Я могу измерить размеры текста с помощью 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;
}

Большое спасибо

...