WM_PAINT не отправлять при использовании WS_EX_COMPOSITE

Я работаю в устаревшем приложении, использующем MFC.

У нас есть механизм для включения / выключения элементов управления в зависимости от бизнес-логики.

Этот механизм реализован в производном от CView классе. Он работает так, что все представления в приложении получены из общего класса, производного от CView (CBaseView), а в PreTranslateMessage все элементы управления представлением включены / отключены.

До сих пор это работало нормально, потому что все элементы управления посылают как минимум сообщение WM_PAINT, когда они должны быть нарисованы. Таким образом, система работала без необходимости перемещать мышь или что-либо еще. Недавно я добавил некоторые функции рисования, и мне пришлось использовать WS_EX_COMPOSITE, чтобы избежать мерцания. Когда этот флаг активирован, мой производный от CView класс не получает никаких вызовов PreTranslateMessage при создании представления.... поэтому элементы управления не отключаются, пока пользователь не наведет указатель мыши на элемент управления.

Я понимаю, что нет способа отправить WM_PAINT с использованием WS_EX_COMPOSITE, но есть ли другое сообщение, которое я могу использовать, чтобы получить такое же поведение???

Отредактировано:

В настоящее время я использую подход OnIdle, но у него есть большой недостаток: окна не становятся бездействующими до тех пор, пока не будут нарисованы все элементы управления... поэтому, когда вы входите в экран, все элементы управления включены и сразу же отключены... это делает довольно некрасивый эффект!

Больше решений???

Заранее спасибо...

2 ответа

Решение

Логическим местом для включения / отключения элементов управления будет CView:: OnUpdate, он вызывается платформой после изменения документа представления и из OnInitialUpdate(); Вы также можете вызвать эту функцию, если есть какие-то изменения, которые повлекут за собой переоценку вашей бизнес-логики.

РЕДАКТИРОВАТЬ После более подробного изучения вопроса вы также можете опубликовать личное сообщение в конце OnInitialUpdate и "поймать" его в своем PreTranslateMessage:

PostMessage(WM_APP, 0, 0);

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

Другие вопросы по тегам