【问题标题】:Rotate Text by 90 degrees with GDI使用 GDI 将文本旋转 90 度
【发布时间】:2023-04-09 13:18:01
【问题描述】:

我想将文本绘制到 GDI 表面并将该文本逆时针旋转 90 度。我更喜欢使用 DrawText 来绘制文本,因为它支持回车。我尝试使用带有 lfEscapement 的字体(请参见下面的代码),但该行没有旋转 - 一条线被渲染到另一条线上。有没有可能旋转文本?还是不旋转渲染并旋转整个设备上下文?


普通文本布局:


旋转(期望的结果):

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

【问题讨论】:

    标签: c++ windows winapi gdi


    【解决方案1】:

    我的印象是这个链接回答了你的问题,但使用的是 ExtTextOut,而不是 DrawText

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

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

    【讨论】:

    • 感谢您的回答,我尝试了 TA_BASELINE,但结果非常奇怪(文本呈现在屏幕顶部)。我在 codeproject 上看到了文章。我看到的唯一问题是我需要自己处理回车/行长。
    • 只是另一个建议,在 codeguru 的这个链接上,有旋转位图的例子。您可以在兼容 DC 的位图中将文本水平绘制到主 DC,然后在主 DC 中旋转使用它。 codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743
    【解决方案2】:
       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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 2011-03-22
      • 1970-01-01
      • 2016-08-17
      • 2015-12-20
      • 2015-03-22
      • 2022-01-13
      • 2011-09-24
      相关资源
      最近更新 更多