gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:01:40 26 4
gpt4 key购买 nike

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

编辑:简化问题:

我需要在窗口中间绘制的文本周围绘制一个矩形。
-如何填充矩形坐标?
-有人可以帮忙吗-Rectangle(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);

最佳答案

您实际上不必自己将文本居中。如果传递适当的标志,则GDI文本输出功能可以为您完成此操作。

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

假设您只有一行文本(听起来像您这样),则可以通过传递DT_SINGLELINEDT_VCENTER标志来使其自动垂直居中。

因此,您真正要做的就是编写代码将your window's client area分成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);
}

关于winapi - win32-如何在文本字符串周围绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com