MF C: как рисовать текст с переносом и v-центрированием? - PullRequest
0 голосов
/ 08 марта 2020

Следующий код dr aws text с использованием DrawText (одна строка) и DrawTextEx (перенос). Я хочу, чтобы оба были v-центрированными.

    CRect rect1(50, 50, 100, 125);
    CRect rect2(100, 50, 500, 125);

    CPen pen(PS_SOLID, 0, RGB(192, 192, 192));

    pDC->MoveTo(rect1.left, rect1.top);
    pDC->LineTo(rect2.right, rect2.top);
    pDC->MoveTo(rect1.left, rect1.bottom);
    pDC->LineTo(rect2.right, rect2.bottom);

    pDC->DrawText("hello", rect1, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    pDC->DrawTextEx("0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 ",
                    rect2, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_VCENTER, NULL);

Результат показан на рисунке ниже, похоже, что одна строка v-центрирована, но не та, с переносом. Кроме того, обратите внимание, что часть верхней строки покрыта, что также должно быть адресовано.

enter image description here

1 Ответ

3 голосов
/ 08 марта 2020

DT_VCENTER может использоваться только в комбинации с DT_SINGLELINE. Для многострочного рисования используйте DT_CALCRECT, чтобы получить высоту, а затем вручную рассчитайте центр. Пример:

CString str = "0123456789 0123456789 0123456789 0123456789 0123456789";
CRect rc = rect2;
dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_CALCRECT);
rc.OffsetRect(0, (rect2.Height() - rc.Height()) / 2);
dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT);
...