0

我有一个需要按需重绘多行文本的窗口,文本可以是可变长度的。那么如何去做呢?

这是我现在拥有的,它不起作用。

               RECT rc;

               GetWindowRect ( hwnd, &rc );



               int rectHeight = DrawText( hMemDc, text.c_str(), text.size(), &rc, DT_CALCRECT );                    // Get formating rectangle height


               int windowHight = rc.bottom - rc.top;
               int windowWidth = rc.right - rc.left;


               int yTop = rc.top + (  ( windowHight - rectHeight ) / 2  );
               int yBottom = yTop + rectHeight;

               int xLeft = rc.left + 20;
               int xRight = rc.right - 20;


               rc.top       = yTop;
               rc.bottom    = yBottom;
               rc.left      = xLeft;
               rc.right     = xRight;


               DrawText( hMemDc, text.c_str(), text.size(), &rc, DT_LEFT | DT_WORDBREAK );
4

2 回答 2

2

您的代码中有两个问题。首先,您需要DT_WORDBREAKDT_CALCRECT调用中指定,否则它不会将文本换行以适应可用宽度。

int rectHeight = DrawText( hMemDc, text.c_str(), text.size(), &rc,
  DT_CALCRECT|DT_WORDBREAK );

其次,DT_CALCRECT调用将用计算出的矩形覆盖rc变量,因此您的窗口高度将是错误的,并且您的居中将不起作用。在调用之前保存rc变量DT_CALCRECT,或者之后再次调用GetWindowRect

GetWindowRect ( hwnd, &rc );
于 2013-06-27T09:16:21.973 回答
0

我解决了绘制一些调试线来帮助我编写代码的问题:

                {
                    CPen p;
                    p.CreatePen(PS_SOLID, 0, RGB(0,0,255));
                    pDrawDC->SelectObject(&p);

                    pDrawDC->MoveTo(rc.TopLeft());
                    pDrawDC->LineTo(rc.BottomRight());
                }

                CRect rdebug(rc);

                int height= pDrawDC->DrawText(sLabel, &rdebug, DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_CALCRECT);

                {
                    CPen p;
                    p.CreatePen(PS_SOLID, 0, RGB(0,255,0));
                    pDrawDC->SelectObject(&p);

                    pDrawDC->MoveTo(rdebug.TopLeft());
                    pDrawDC->LineTo(rdebug.BottomRight());
                }

                int center_y= rc.CenterPoint().y;
                rc.top= center_y - height / 2;
                rc.bottom= center_y + height /2;

                {
                    CPen p;
                    p.CreatePen(PS_SOLID, 0, RGB(255,0,0));
                    pDrawDC->SelectObject(&p);

                    pDrawDC->MoveTo(rc.TopLeft());
                    pDrawDC->LineTo(rc.BottomRight());
                }

                pDrawDC->DrawText(sLabel, rc, DT_CENTER | DT_VCENTER | DT_WORDBREAK);

请注意,rDebug、CPen、LineTo 和 MoveTo 行仅用于调试目的。

我有以下图像:

调试图像

现在,如果没有调试部分,我可以将源代码占用空间减少到:

                int height= pDrawDC->DrawText(sLabel, CRect(rc), DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_CALCRECT);

                int center_y= rc.CenterPoint().y;
                rc.top= center_y - height / 2;
                rc.bottom= center_y + height /2;

                pDrawDC->DrawText(sLabel, rc, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
于 2015-03-24T19:27:47.520 回答