Повернуть текст на 90 градусов с помощью GDI - PullRequest
1 голос
/ 27 августа 2010

Я хочу нарисовать текст на поверхности GDI и повернуть этот текст на 90 градусов против часовой стрелки.Я бы предпочел использовать DrawText для рисования текста, потому что он поддерживает возврат каретки.Я попытался использовать шрифт с lfEscapement (см. Код ниже), но строка не поворачивается - одна строка отображается поверх другой.Есть ли возможность вращать текст?Или для рендеринга без поворота и поворота всего контекста устройства?


Обычный текстовый макет:

alt text


Поворот (желаемый результат):

alt text

    case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);

        LOGFONT lf = {0};
        HANDLE hFont;
        ZeroMemory(&lf, sizeof(LOGFONT));

        lf.lfWeight = FW_NORMAL;
        lstrcpy(lf.lfFaceName, _T("Tahoma"));
        lf.lfEscapement = 90;
        lf.lfHeight = 30;
        hFont = CreateFontIndirect (&lf);
        hFont = (HFONT)SelectObject (ps.hdc, hFont);

        RECT RectBody = {10,lf.lfHeight+10,::GetSystemMetrics(SM_CXSCREEN)-10,::GetSystemMetrics(SM_CYSCREEN)-lf.lfHeight-20};
        {
            ScopedLock lock(me->m_mutex);
            DrawText (ps.hdc, me->GetMessageString().c_str(), (int)me->GetMessageString().length(), &RectBody, 0);
        }

        hFont = (HFONT)SelectObject (ps.hdc, hFont);
        DeleteObject (hFont);

        EndPaint(hWnd, &ps);
        break;
    }

Ответы [ 2 ]

3 голосов
/ 27 августа 2010
   lf.lfEscapement = 90;

Это должно быть 900, чтобы получить текст по вертикали, единицы - 0,1 градуса.

Боюсь, ваш план по обеспечению DrawText позаботится о разрыве строк. Я не мог убедить его правильно выровнять текст. Он выравнивается по последней строке, а не по первой. Некоторый код для игры:

    wchar_t* msg = L"Hello\r\nworld";
    RECT rcMeasure = {0, 0, 400, 0};
    DrawTextEx(hdc, msg, -1, &rcMeasure, DT_CALCRECT, 0);
    RECT rcDraw = {10, 30, 10 + rcMeasure.bottom - rcMeasure.top, 30 + rcMeasure.right - rcMeasure.left };
    FillRect(hdc, &rcDraw, (HBRUSH) (COLOR_WINDOW+2));
    SetTextAlign(hdc, TA_TOP | TA_CENTER);
    DrawTextEx(hdc, msg, -1, &rcDraw, DT_BOTTOM, 0);

Я думаю, что перепробовал все варианты выравнивания.

0 голосов
/ 27 августа 2010

У меня такое впечатление, что эта ссылка отвечает на ваш вопрос, но с использованием ExtTextOut, а не DrawText

http://www.codeproject.com/KB/GDI/textrotation.aspx

это не GDI + это MFC, но они близки.

...