1

我在 Win32 程序中使用 DrawText 函数在屏幕顶部中心显示“本地”,在中心显示“服务器”。当我运行程序时,它显示“本地”而不是“服务器”。这是我的消息循环中的代码:

case WM_PAINT:
        {
            RECT localLabel;
            localLabel.left = 0;
            localLabel.top = 0;
            localLabel.right = 270;
            localLabel.bottom = 20;
            PAINTSTRUCT localPs;
            HDC localHandle = BeginPaint(hwnd, &localPs);
            DrawText(localHandle, "Local", -1, &localLabel, DT_CENTER);
            EndPaint(hwnd, &localPs);

            PAINTSTRUCT serverPs;
            RECT serverLabel;
            serverLabel.left = 0;
            serverLabel.top = 100;
            serverLabel.right = 270;
            serverLabel.bottom = 20;
            HDC serverHandle = BeginPaint(hwnd, &serverPs);
            DrawText(serverHandle, "Server", -1, &serverLabel, DT_CENTER);
            EndPaint(hwnd, &serverPs);
        }
        break;

我尝试使用相同的 PAINTSTRUCT 但这没有帮助。我尝试使用相同的 HDC,但这也无济于事。如何在屏幕上同时显示两者?

谢谢。

4

4 回答 4

2

您的第二个矩形无效(bottom应该120代替,20因为它是实际的底部坐标,而不是高度)。此外,您必须在调用之前渲染两个字符串EndPaint()

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

RECT localLabel;
localLabel.left = 0;
localLabel.top = 0;
localLabel.right = 270;
localLabel.bottom = 20;
DrawText(hdc, "Local", -1, &localLabel, DT_CENTER);

RECT serverLabel;
serverLabel.left = 0;
serverLabel.top = 100;
serverLabel.right = 270;
serverLabel.bottom = 120;
DrawText(hdc, "Server", -1, &serverLabel, DT_CENTER);

EndPaint(hwnd, &ps);

最后,顺便说一句,您可能不想将所有代码留在窗口过程的一个case语句中。考虑将其移动到自己的函数中以提高可读性(和可维护性)。

于 2011-02-19T12:08:20.547 回答
2

首先,你的bottom坐标在你的top上面,是故意的吗?

然后,您应该为收到的每个电话拨打BeginPaint/EndPaint一次。WM_PAINT它通常是这样的:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC localHandle = BeginPaint(hwnd, &ps);
    // do *all* the drawing
    EndPaint(hwnd, &ps);
}
break;
于 2011-02-19T12:09:29.990 回答
0

“底部”正是矩形的底部。您正在使用它,就好像它是高度一样。

serverLabel.bottom = serverLabel.top + 20;
于 2011-02-19T12:07:22.183 回答
0

在我看来 serverLabel.bottom = 20; 应该是 serverLabel.bottom = 120

于 2011-02-19T12:07:31.963 回答