DrawText отображает только первый звонок

Я использую функцию DrawText в программе Win32 для отображения "Local" в верхней центральной части экрана и "Server" в центре. Когда я запускаю программу, она отображает "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 ответа

Решение

Ваш второй прямоугольник недействителен (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 заявления. Подумайте о том, чтобы переместить его в собственную функцию, чтобы улучшить удобочитаемость (и удобство обслуживания)

Прежде всего, ваш bottom координата над вашим top один, это намеренно?

Затем вы должны позвонить BeginPaint/EndPaint только один раз для каждого WM_PAINT Вы получите. Обычно это выглядит так:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC localHandle = BeginPaint(hwnd, &ps);
    // do *all* the drawing
    EndPaint(hwnd, &ps);
}
break;

"дно" это именно то, нижняя часть прямоугольника. Вы используете это, как будто это была высота.

serverLabel.bottom = serverLabel.top + 20;

Сдается мне, что serverLabel.bottom = 20; должно быть serverLabel.bottom = 120;

Другие вопросы по тегам