你实际上并不需要自己居中文本。如果您传递适当的标志,GDI文本输出功能可以为您做到这一点。
例如,如果您调用DrawText
并通过DT_CENTER
标志,它将自动在指定的矩形(水平居中)中间绘制文本。
假设你只有文本(这听起来像你这样做)的单行线,你可以让它自动垂直中心通过传递DT_SINGLELINE
和DT_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);
}
这气味像功课。你的努力或你的程序结构在哪里? – 2013-04-23 00:59:33
GY - 同意这是一个家庭作业 - 但是对于win32编程来说相对较新 - 并且基于我读过的内容 - 需要创建一个基于临时内存的DC来计算文本的大小/宽度 - 找到大部分从这个线程的答案,但不知道如何创建一个临时DC来执行此任务。即使它是一个矩形包围的单个文本 - 我可以进一步扩展它 - http://stackoverflow.com/questions/1835749/win32-text-drawing-puzzle – ejuser 2013-04-23 01:02:34
这是我有这样的代码的最低版本远(用于单个文本):\t 情况WM_PAINT: \t \t HDC =调用BeginPaint(HWND,&ps); \t \t GetClientRect(HWND,&RC客户机); \t \t选择对象(HDC,GetStockObject(DEFAULT_GUI_FONT)); \t \t SetTextColor (hdc,RGB(255,0,0)); \t \t DrawText(hdc,wstring(s.begin(),s.end())。c_str(),-1 ,&rcClient,DT_SINGLELINE | DT_CENTER | DT_VCENTER); \t \t // TODO:在此添加任何图纸代码... \t \t调用EndPaint(HWND,&ps); \t \t突破; – ejuser 2013-04-23 01:08:08