Winapi win32-如何围绕文本字符串绘制矩形? 我是Win32新手,试图在C++中获得基于GDI的代码(出于技术原因,不想使用GDI+)

Winapi win32-如何围绕文本字符串绘制矩形? 我是Win32新手,试图在C++中获得基于GDI的代码(出于技术原因,不想使用GDI+),winapi,gdi,Winapi,Gdi,编辑:简化问题: 我需要在窗口中间绘制的文本周围画一个矩形。 -如何填充矩形坐标? -有人能帮忙画直线矩形(x1,y1,x2,y2)吗如何计算这些(x1,y1)和(x2,y2)值 谢谢 hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rcClient); SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); SetTextColor(hd

编辑:简化问题:

我需要在窗口中间绘制的文本周围画一个矩形。 -如何填充矩形坐标? -有人能帮忙画直线矩形(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文本输出函数可以为您完成这项工作

例如,如果你调用并通过<代码> DTyCalueFLAG,它将自动在指定矩形的中间(水平为中心)绘制文本。

假设您只有一行文本(听起来像是这样),您可以通过传递
dtu SINGLELINE
dtu 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);
}
void PaintWindow(HWND-HWND)
{
//为绘图设置设备上下文。
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hWnd和ps);
HPEN hpenOld=静态强制转换(SelectObject(hDC,GetStockObject(DC_-PEN));
HBRUSH hbrushOld=静态强制转换(选择对象(hDC、GetStockObject(空笔刷));
//计算4个相等矩形的尺寸。
矩形窗口;
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;
//(可选)将每个矩形放气任意量,以便
//它们不会紧靠在一起,我们可以区分它们。
充气(&rc1,-5,-5);
充气(&rc2,-5,-5);
充气(&rc3,-5,-5);
充气(&rc4,-5,-5);
//围绕这些矩形绘制(不同颜色的)边框。
SetDCPenColor(hDC,RGB(255,0,0));//红色
矩形(hDC,rc1.left,rc1.top,rc1.right,rc1.bottom);
SetDCPenColor(hDC,RGB(0,255,0));//绿色
矩形(hDC,rc2.left,rc2.top,rc2.right,rc2.bottom);
SetDCPenColor(hDC,RGB(0,0,255));//蓝色
矩形(hDC、rc3.left、rc3.top、rc3.right、rc3.bottom);
SetDCPenColor(hDC,RGB(255,128,0));//橙色
矩形(hDC,rc4.left,rc4.top,rc4.right,rc4.bottom);
//将文本绘制到每个矩形的中心。
SetBkMode(hDC,透明);
SetBkColor(hDC,RGB(0,0,0));//黑色
//TODO:可选设置比默认字体更好的字体。
DrawText(hDC,TEXT(“Hello World!”),-1,&rc1,DT|U中心| DT|U单线| DT|U VCENTER);
DrawText(hDC,TEXT(“Hello World!”),-1和rc2,DT|U中心| DT|U单线| DT|U VCENTER);
DrawText(hDC,TEXT(“Hello World!”),-1和rc3,DT|U中心| DT|U单线| DT|U VCENTER);
DrawText(hDC,TEXT(“Hello World!”),-1和rc4,DT|U中心| DT|U单线| DT|U VCENTER);
//打扫干净。
选择对象(hDC、hpenOld);
选择对象(hDC、hbrushOld);
端漆(hWnd和ps);
}

终于明白了:)非常感谢科迪·格雷为我指明了正确的方向:)


G.Y-同意这更像是一个家庭作业-但对win32编程来说相对较新-并且基于我所读的内容-需要创建一个基于临时内存的DC来计算文本的大小/宽度-从这个线程中找到了大多数答案,但不知道如何创建一个临时DC来执行此任务。即使它是一个由矩形包围的单个文本-我可以进一步展开-这是我迄今为止(对于单个文本)代码的最低版本:case WM_PAINT:hdc=BeginPaint(hWnd,&ps);GetClientRect(hWnd和rcClient);选择对象(hdc、GetStockObject(默认图形用户界面字体));SetTextColor(hdc,RGB(255,0,0));DrawText(hdc、wstring(s.begin()、s.end()).c_str()、-1和rcClient、DT_单线| DT|u中心| DT|u VCENTER);//TODO:在此处添加任何绘图代码。。。端漆(hWnd和ps);打破阅读所有这些:最重要的:谢谢G.Y.感谢这些链接(其中之一是GDI+,我想避免)。如果您或其他人能够提供一段代码片段,在窗口中心绘制一些文本并用矩形包围它,我将不胜感激。要求使用矩形的原因是,这将使我更好地理解如何计算文本到像素,并为我澄清许多事情。现阶段进一步探索。。谢谢你可以通过点击问题下方的链接,然后点击下面的(橙色图标)来发布代码。与传统论坛不同,Stack Overflow鼓励您在问答中添加信息,而不是留下一连串的评论。谢谢Cody。关于单线,你的假设是正确的。这当然有帮助。想知道(X,Y)坐标是否已知-文本是否可以围绕它(而不是矩形)居中?想象一下——为此需要计算文本的高度和宽度——以(X,Y)为中心?(为这个问题道歉,因为我实际上是想找到一个解决方案,使文本围绕(x,y)(垂直和水平)居中). Thanks@ejuser当然,如果你知道坐标,你可以创建一个包含它们的矩形结构,并将其传递给
DrawText
。是的,如果你愿意,你可以自己计算一个文本字符串所需的宽度和高度。为此,你可以使用,就像我记得你在问题中提到的那样。这比lee更费事我会帮你做的。更多的信息是。谢谢科迪。你愿意吗
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);
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);