WM_SETREDRAW и потеря Z-порядка / фокуса - PullRequest
2 голосов
/ 12 февраля 2012

У меня есть приложение .NET с библиотекой обложки (Devexpress) и родительской формой MDI.

Когда я добавляю дочерние формы, я использую WM_SETREDRAW , чтобы отключить рисование по соображениям производительности.

Однако после установки WM_SETREDRAW на 1 и вызова refresh на родительском объекте MDI основная форма теряет свой z-порядок и находится на заднем плане на моем рабочем столе..

Я должен позвонить BringToFront или Focus тогда, но все еще есть короткий период времени (<1 с), в котором мое приложение «исчезает» для пользователя. </p>

Есть ли лучший способ отключить перерисовку, но оставить форму видимой?

1 Ответ

3 голосов
/ 12 февраля 2012

Я подозреваю, что проблема связана с этим замечанием в документации :

Если приложение отправляет сообщение WM_SETREDRAW в скрытое окно, окно становится видимым (то есть операционная система добавляет стиль WS_VISIBLE к окну).

Поскольку скрытое окно эффективно отключено (хотя оно все еще может обрабатывать сообщения, оно не может получать пользовательский ввод), это приводит к тому, что вы запускаете неправильный порядок включения и выключения окон. Когда текущее окно с фокусом становится отключенным (и, следовательно, теряет фокус), фокус должен перемещаться куда-нибудь , потому что он не может быть нигде.

Трудно сказать точно , что происходит в вашем случае, не видя код. Я также не совсем уверен по вашему вопросу, отправляете ли вы сообщение WM_SETREDRAW родительскому MDI или дочернему MDI. Но я могу сказать, что библиотеки скинов печально известны тем, что что-то напортачили и вызывают кошмарные ошибки. Спросите себя, действительно ли вам в первую очередь нужна такая вещь, и действительно ли она того стоит?

Я также должен подвергнуть сомнению основную мотивацию:

Когда я добавляю дочерние формы, я использую WM_SETREDRAW, чтобы отключить рисование по соображениям производительности.

При добавлении дочерних форм не должно быть проблем с рисованием или производительностью при условии, что вы выполняете всю инициализацию внутри конструктора формы, а не каким-либо другим методом. Это гарантирует, что все будет правильно инициализировано до отображения формы, и нет необходимости в нескольких перерисовках. Все рисуется ровно один раз, при первом отображении формы, что в точности повторяется в идеальном случае с WM_SETREDRAW: оно рисуется только один раз после включения перерисовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...