代码之家  ›  专栏  ›  技术社区  ›  user180574

如何用环绕和v形居中绘制文本?

  •  0
  • user180574  · 技术社区  · 5 年前

    下面的代码使用DrawText(单行)和DrawTextEx(换行)绘制文本。我要两个v形中心。

        CRect rect1(50, 50, 100, 125);
        CRect rect2(100, 50, 500, 125);
    
        CPen pen(PS_SOLID, 0, RGB(192, 192, 192));
    
        pDC->MoveTo(rect1.left, rect1.top);
        pDC->LineTo(rect2.right, rect2.top);
        pDC->MoveTo(rect1.left, rect1.bottom);
        pDC->LineTo(rect2.right, rect2.bottom);
    
        pDC->DrawText("hello", rect1, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        pDC->DrawTextEx("0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 ",
                        rect2, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_VCENTER, NULL);
    
    

    输出如下图所示,看起来单线是v形居中的,但不是有环绕的那条。另外,请注意,上面的一些行已经被覆盖了,这也应该得到解决。

    enter image description here

    1 回复  |  直到 5 年前
        1
  •  3
  •   Barmak Shemirani    5 年前

    DT_VCENTER 只能与 DT_SINGLELINE . 对于多线绘制,请使用 DT_CALCRECT 要获得高度,则手动计算中心。例子:

    CString str = "0123456789 0123456789 0123456789 0123456789 0123456789";
    CRect rc = rect2;
    dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_CALCRECT);
    rc.OffsetRect(0, (rect2.Height() - rc.Height()) / 2);
    dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT);