DrawText отображает только первый звонок - PullRequest
1 голос
/ 19 февраля 2011

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

2 голосов
/ 19 февраля 2011

Прежде всего, ваша 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 голосов
/ 19 февраля 2011

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

0 голосов
/ 19 февраля 2011

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

0 голосов
/ 19 февраля 2011

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

serverLabel.bottom = serverLabel.top + 20;
...