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;