MF C DrawText, вертикальный, DT_CALCRECT с lf_escapement = 900 - PullRequest
0 голосов
/ 25 мая 2020

Я работаю над проектом MF C с некоторыми чертежами GDI. Я использую DC.DrawText, чтобы нарисовать вертикальный текст в DC, используя LOGFONT с lfEscapement = 900. Текст выводится, когда я использую DT_NOCLIP в желаемом вертикальном форматировании. Однако для центрирования этого текста я использовал вызов DC.DrawText с аргументом DT_CALCRECT. Я понял, что, несмотря на то, что текст действительно нарисован вертикально, ширина CRect больше, чем высота. Моя интуиция подсказывает мне, что вертикально нарисованный текст должен иметь высоту больше, чем ширину. Расчет центровки текста я не включил. Вопрос только в том, на что я могу положиться, когда реализую это вертикальное центрирование.

Игнорирует ли DC.DrawText с DT_CALCRECT спусковой механизм?

void CMFCFontTestDlg::OnPaint()
{
  CPaintDC dc(this); // Gerätekontext zum Zeichnen

  if (IsIconic())
  {
    ...
  }
  else
  {
    CDialogEx::OnPaint();

    CRect clTextRect;
    CFont myFont;

    myFont.CreateFont(12, 0, 900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("Tahoma"));

    CFont* oldFont = dc.SelectObject(&myFont);

    dc.DrawText(_T("000000"), clTextRect, DT_CALCRECT);
    clTextRect.MoveToXY(100, 100);

    dc.DrawText(_T("000000"), clTextRect, DT_NOCLIP);
    dc.SelectObject(oldFont);
  }
}

enter image description here Vertically formatted text in DC

1 Ответ

0 голосов
/ 25 мая 2020

Я узнал об этом в комментариях к функции DrawTextEx https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtextexa. Однако обратите внимание, что ни документация DrawText ничего не говорит об этом, ни документация флага DT_CALCRECT. Это, вероятно, будет контролироваться, если используется DrawText, а не DrawTextEx. Я сообщил об этом MS через "Эта страница полезна?" возможность обратной связи.

Замечания

Функция DrawTextEx поддерживает только шрифты, у которых как спуск, так и ориентация равны нулю.

Режим выравнивания текста для контекста устройства должен включить флаги TA_LEFT, TA_TOP и TA_NOUPDATECP.

Учитывая это, решение состоит в том, чтобы использовать некоторые вычисления тригонометрии c, начиная с размера, определенного для спуска = 0, а затем вычислить верхняя левая и нижняя правая точки повернутого прямоугольника.

...