win32 - 如何在文本字符串周围绘制一个矩形?

时间:2013-04-23 00:53:35

标签: winapi gdi

我是Win32的新手并试图在C ++中获取基于GDI的代码(出于技术原因不想使用GDI +)

编辑:简化问题:

我需要在窗口中间绘制的文本周围绘制一个矩形。 - 如何填充矩形坐标? - 任何人都可以帮助线 - 矩形(x1,y1,x2,y2)? - 如何计算这些(x1,y1)& (x2,y2)值?

谢谢..

        hdc = BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &rcClient);
    SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
    SetTextColor(hdc, RGB(255, 0, 0));

    DrawText(hdc, wstring(s.begin(),s.end()).c_str(), -1, &rectResult, DT_SINGLELINE | DT_CALCRECT);

    DrawText(hdc, wstring(s.begin(),s.end()).c_str(), -1, &rcClient, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    // Here I need help - How to I place the rectangle around the Text - which is drawn in the middle of the window?
    // It looks like need to use - rectResult.bottom/top/left/right - but don't know how.. 
    Rectangle(hdc, 0,0,100,100);   

3 个答案:

答案 0 :(得分:9)

您实际上并不需要自己居中。如果传递适当的标志,GDI文本输出函数可以为您完成。

例如,如果您调用DrawText并传递DT_CENTER标记,它将自动在指定矩形的中间绘制文本(水平居中)。

假设您只有一行文字(听起来就是这样),您可以通过传递DT_SINGLELINE和{{1来自动垂直将文本居中。标志。

所以你真正需要做的就是编写代码将your window's client area分成4个相等的部分,然后将这些矩形传递给DT_VCENTER函数。这不是非常困难。如果你无法在头脑中看到它,请将铅笔和纸放在上面。

DrawText

答案 1 :(得分:1)

RECT rect={0,0,0,0};
const char *str="Test Text";
DrawText(hDC, str, strlen(str), &rect, DT_CALCRECT | DT_NOCLIP);
Rectangle(hDC,rect.left,rect.top,rect.right,rect.bottom);
DrawText(hDC, str, strlen(str), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE|DT_NOCLIP);

答案 2 :(得分:1)

终于得到了:)非常感谢Cody Gray指出我正确的方向:)

GetTextExtentPoint32(hDC, str, strlen(str), &sz2); 
rect2.top=rect2.bottom+sz2.cy;
rect2.right=rect2.top+sz2.cx;
Rectangle(hDC,rect2.left,rect2.top,rect2.right,rect2.bottom);
DrawText(hDC, str, -1, &rect2, DT_CENTER | DT_VCENTER | DT_SINGLELINE|DT_NOCLIP);