WIN32 изменить текст внутри TextOut

Это отобразит текст на экране с ПРОЗРАЧНЫМ фоном и цветным текстом, но что, если я захочу изменить

напишите позже, как мне быть? я должен использовать: SendMessage(); или: SetWindowText() Если да, то как и если

нет, а что тогда??? и как

case WM_PAINT:

       dc = BeginPaint(hwnd, &Ps);

SetBkMode(dc, TRANSPARENT);

        SetTextColor(dc, RGB(454,0,0)); 

       TextOut(dc, 10, 200, L"SEE? ", 5);

       EndPaint(hwnd, &Ps);

       break;

person user1417815    schedule 06.06.2012    source источник
comment
Используйте переменную, чтобы этот код мог рисовать любой текст. Вызовите InvalidateRect(), когда вы изменяете переменную, чтобы окно рисовало новый текст.   -  person Hans Passant    schedule 06.06.2012


Ответы (1)


Если вы хотите нарисовать текст, связанный с вашим окном, вот что вам нужно сделать:

  1. Не вызывайте TextOut с жестко закодированной строкой. Вместо этого получите его через GetWindowText.
  2. Добавьте обработчик к WM_SETTEXT сообщению. Получив его - аннулируйте свое окно (или хотя бы область, где предполагается отрисовка текста).

Теперь некоторые пояснения по поводу прозрачности и т.д.

Я предполагаю, что у вашего окна есть связанная фоновая кисть (т.е. его WNDCLASS имел ненулевой hbrBackground член при регистрации класса). Если нет - вы рисуете прозрачный текст над незакрашенной областью, которая может содержать всякий хлам.

Во время вызова BeginPaint ваша оконная процедура получает WM_ERASEBACKGROUND. Предполагая, что вы передадите его DefWindowProc - клиентская область вашего окна будет заполнена фоновой кистью. Так что каждый раз, когда вы начинаете рисовать - клиентское пространство вашего окна будет заполняться какой-нибудь кистью. Затем вы прозрачно рисуете текст на только что заполненном фоне. Чтобы не было размазывания.

Всякий раз, когда вы хотите изменить что-то визуальное в своем окне, недостаточно рисовать дополнительные элементы на месте. Потому что в любой момент ОС может запросить у вашего окна перерисовку. Так что ваше окно должно адекватно отрисовываться при получении WM_PAINT.

Обычной практикой является аннулирование вашего окна (или его части с помощью InvalidateRect или аналогичной функции) при каком-либо изменении. А потом, когда получите WM_PAINT - перекрасьте свое окно.

person valdo    schedule 06.06.2012