代码之家  ›  专栏  ›  技术社区  ›  David Feurle

使用GDI将文本旋转90度

  •  1
  • David Feurle  · 技术社区  · 16 年前

    我想把文本绘制到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 回复  |  直到 10 年前
        1
  •  3
  •   Hans Passant    16 年前
       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);
    

    我想我试过所有的方法。

        2
  •  0
  •   Stephane Rolland    16 年前

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

    不是GDI+是MFC,但他们很接近。

    推荐文章