使用GDI将文本旋转90度

时间:2010-08-27 12:20:06

标签: c++ windows winapi gdi

我想将文本绘制到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 个答案:

答案 0 :(得分:3)

   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);

我想我尝试了所有对齐选项。

答案 1 :(得分:0)

我的印象是此链接可以回答您的问题,但使用的是ExtTextOut,而不是DrawText

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

它不是GDI +它是MFC但它们很接近。