Flicker
Мерцание можно разрешить, передав WM_ERASEBKGND
и убедившись, что оно ничего не делает. Мерцание может возникать, потому что каждое окно обрабатывает это сообщение перед каждой краской, чтобы стереть недопустимую область, используя свой цвет фона. Если вы обрабатываете это и ничего не делаете, стирание не происходит - просто убедитесь, что ваш обработчик WM_PAINT
закрашивает всю недействительную область, или вы оставите артефакты из предыдущей краски.
Однако, в этом случае, я полагаю, мерцание происходит, потому что W1 рисует себя сначала, затем W2, затем W3 на каждой краске. Это говорит о том, что WS_EX_TRANSPARENT
не является способом решения проблемы, с которой вы столкнулись.
Отсутствует WM_PAINT
Трудно понять, как это отследить. В .NET это происходит потому, что дочерние окна скрывают всю клиентскую область элемента управления, и поэтому сообщение рисования не распространяется, но я считаю, что это специфическое поведение .NET. Если бы вы могли предоставить пример проекта или пример кода, который демонстрирует проблему, это было бы большой помощью.
Тем временем вы можете удалить W3, чтобы W2 не был скрыт, и посмотреть, все ли сообщения рисования вернутся. Также обратите внимание, что CWnd::Invalidate
не принимает значение NULL в качестве опции, оно принимает BOOL
(TRUE
или FALSE
).