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

eju*_*ser 4 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);   
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 9

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

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

假设你只有一行文字(你听起来像这样),你可以通过传递和标志来自动垂直居中文本.DT_SINGLELINEDT_VCENTER

所以你真正需要做的就是编写代码将窗口的客户区域划分为4个相等的部分,然后将这些矩形传递给DrawText函数.这不是非常困难.如果你无法在头脑中看到它,请将铅笔和纸放在上面.

void PaintWindow(HWND hWnd)
{
   // Set up the device context for drawing.
   PAINTSTRUCT ps;
   HDC hDC = BeginPaint(hWnd, &ps);
   HPEN hpenOld = static_cast<HPEN>(SelectObject(hDC, GetStockObject(DC_PEN)));
   HBRUSH hbrushOld = static_cast<HBRUSH>(SelectObject(hDC, GetStockObject(NULL_BRUSH)));

   // Calculate the dimensions of the 4 equal rectangles.
   RECT rcWindow;
   GetClientRect(hWnd, &rcWindow);

   RECT rc1, rc2, rc3, rc4;
   rc1 = rc2 = rc3 = rc4 = rcWindow;

   rc1.right  -= (rcWindow.right - rcWindow.left) / 2;
   rc1.bottom -= (rcWindow.bottom - rcWindow.top) / 2;

   rc2.left   = rc1.right;
   rc2.bottom = rc1.bottom;

   rc3.top   = rc1.bottom;
   rc3.right = rc1.right;

   rc4.top  = rc1.bottom;
   rc4.left = rc1.right;

   // Optionally, deflate each of the rectangles by an arbitrary amount so that
   // they don't butt up right next to each other and we can distinguish them.
   InflateRect(&rc1, -5, -5);
   InflateRect(&rc2, -5, -5);
   InflateRect(&rc3, -5, -5);
   InflateRect(&rc4, -5, -5);

   // Draw (differently-colored) borders around these rectangles.
   SetDCPenColor(hDC, RGB(255, 0, 0));    // red
   Rectangle(hDC, rc1.left, rc1.top, rc1.right, rc1.bottom);
   SetDCPenColor(hDC, RGB(0, 255, 0));    // green
   Rectangle(hDC, rc2.left, rc2.top, rc2.right, rc2.bottom);
   SetDCPenColor(hDC, RGB(0, 0, 255));    // blue
   Rectangle(hDC, rc3.left, rc3.top, rc3.right, rc3.bottom);
   SetDCPenColor(hDC, RGB(255, 128, 0));  // orange
   Rectangle(hDC, rc4.left, rc4.top, rc4.right, rc4.bottom);

   // Draw the text into the center of each of the rectangles.
   SetBkMode(hDC, TRANSPARENT);
   SetBkColor(hDC, RGB(0, 0, 0));   // black
   // TODO: Optionally, set a nicer font than the default.
   DrawText(hDC, TEXT("Hello World!"), -1, &rc1, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
   DrawText(hDC, TEXT("Hello World!"), -1, &rc2, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
   DrawText(hDC, TEXT("Hello World!"), -1, &rc3, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
   DrawText(hDC, TEXT("Hello World!"), -1, &rc4, DT_CENTER | DT_SINGLELINE | DT_VCENTER);

   // Clean up after ourselves.
   SelectObject(hDC, hpenOld);
   SelectObject(hDC, hbrushOld);
   EndPaint(hWnd, &ps);
}
Run Code Online (Sandbox Code Playgroud)