DrawText仅显示第一个调用

时间:2011-02-19 12:01:50

标签: c++ winapi drawtext

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

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 个答案:

答案 0 :(得分: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语句中。考虑将其移入自己的功能以提高可读性(和可维护性)。

答案 1 :(得分: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;

答案 2 :(得分:0)

“bottom”就是那个,rect的底部。你正在使用它,好像它是高度。

serverLabel.bottom = serverLabel.top + 20;

答案 3 :(得分:0)

我觉得serverLabel.bottom = 20;应该是serverLabel.bottom = 120 ;