Задание по рисованию дочернего элемента управления Win32 (InvalidateRect) (серый фон)

мой вопрос о том, как правильно перекрасить дочерний элемент управления после изменения его текста (в данном случае флажок).

Важно сказать:

  • флажок подкласс и окрашивается в WM_PAINT &
    WM_ERASEBKGND возвращает 1.
  • Окно не использует WS_EX_COMPOSITED, WS_EX_LAYERED или WS_CLIPCHILDREN.
  • флажок не использует WS_EX_TRANSPARENT.

Когда я вызываю InvalidateRect () для флажка, он имеет серый фон (изображение 2).

С другой стороны, когда я вызываю InvalidateRect () в родительском окне, он ведет себя так, как я хочу (изображение 3)

Я думаю, что второй случай работает, потому что также WM_PAINT отправляется в родительское окно, а не просто WM_ERASEBKGND.

В первом случае я не понимаю, почему WM_PAINT не отправляется в родительское окно ИЛИ ЖЕ Зачем WM_ERASEBKGND действительно отправляется в родительское окно.

Заключение: Чтобы перекрасить дочерний элемент управления, нужно ли использовать InvalideRect () на родительском элементе вместо дочернего?


Редактировать: Оказывается, родительское окно получает сообщение WM_ERASEBKGND после того, как я вызываю :: SendMessage (hWnd, WM_SETTEXT, NULL, (:: LPARAM) text.c_str ()); на флажок. Это было не из-за вызова InvalidateRect () для флажка.

Я ожидаю, что это из-за того, что вы хотите нарисовать флажок внутри родительской процедуры. Но почему тогда он также не генерирует WM_PAINT для родительского окна?

Начальный флажок

После вызова InvalidateRect (hWnd, 0, true) на флажок

После вызова InvalidateRect (:: GetParent (hWnd), &checkboxRect, true) в родительском окне.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]