DrawText DT_CALCRECT и SetWorldTransform - PullRequest
       8

DrawText DT_CALCRECT и SetWorldTransform

1 голос
/ 04 апреля 2019

У меня есть следующий код:

XFORM xForm;

SetGraphicsMode(dc, GM_ADVANCED);
SetMapMode(dc, MM_ISOTROPIC);
SetWindowExtEx(dc, 1000, 1000, nullptr);
SetViewportExtEx(dc, 1000, 1000, nullptr);

auto radians = rotation * PI / 180.0f;

xForm.eM11 = cosf(radians);
xForm.eM12 = sinf(radians);
xForm.eM21 = -xForm.eM12;
xForm.eM22 = xForm.eM11;
xForm.eDx = (FLOAT)x;
xForm.eDy = (FLOAT)y;
SetWorldTransform(dc, &xForm);

MoveToEx(dc, x - 100, y, nullptr);
LineTo(dc, x + 100, y);
MoveToEx(dc, x, y - 100, nullptr);
LineTo(dc, x, y + 100);

RECT rect;
rect.left = 0;
rect.right = 10000;
rect.top = 0;
rect.bottom = 10000;
DrawText(dc, text, -1, &rect, DT_CALCRECT);

auto width = rect.right - rect.left;
auto height = rect.bottom - rect.top;

rect.left = x - width / 2;
rect.right = rect.left + width;
rect.top = y - height / 2;
rect.bottom = rect.top + height;
DrawText(dc, text, -1, &rect, DT_TOP | DT_CENTER);

Он предназначен для рисования текста по центру и поворота на девяносто градусов. Проблема заключается в отношении окна ext к окну просмотра ext. Если они идентичны, то есть совпадают, то я вижу две строки с текстом, правильно центрированным по ним.

Если я установлю область просмотра на 500, 500, линии начнут хорошо рисоваться, но текст исчезнет. Теперь я не знаю, как установить прямоугольник перед вызовом DrawText (... DT_CALCRECT ...), но я угадываю что-то большое, поэтому я пробовал размер в 10000 единиц, но это не имело никакого значения.

Как мне заставить DrawText работать и масштабироваться со всем остальным? Он делает правильные вещи для поворота, но не для отношения окна / области просмотра.

Полный проект Visual C ++ находится здесь: https://github.com/imekon/SampleTransform

1 Ответ

0 голосов
/ 05 апреля 2019

Я нашел ответ!

DrawText не работает с масштабированным изотропным видом, но TextOut работает , поэтому код использует DrawText для вывода текста, т.е.здесь:

rect.left = x - width / 2;
rect.right = rect.left + width;
rect.top = y - height / 2;
rect.bottom = rect.top + height;
DrawText(dc, text, -1, &rect, DT_TOP | DT_CENTER);

заменить его на:

TextOut(dc, x - width / 2, y - height / 2, text, _tcslen(text));

Это делает то, что я ожидал сделать DrawText, но рисует его правильно выровненным и справляется с масштабированием окна просмотра против окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...