WM_ENTERSIZEMOVE / WM_EXITSIZEMOVE - при использовании меню не всегда сопряжено - PullRequest
6 голосов
/ 01 декабря 2009

Чтобы мое приложение не меняло содержимое окна, когда пользователь перемещает его окно, я записываю сообщения WM_ENTERSIZEMOVE / WM_EXITSIZEMOVE и приостанавливаю приложение между сообщениями. Однако иногда случается, что я получаю WM_ENTERSIZEMOVE, но не WM_EXITSIZEMOVE вообще. Одна репродукция:

  • открыть окно меню
  • нажмите на Размер
  • не изменяйте размер окна, вместо этого щелкните в окне

Обратите внимание, что окно никогда не получало WM_EXITSIZEMOVE.

При проверке, как это работает, я также проверил образец Microsoft DirectX и заметил ту же проблему. После того, как вы выполните описанные выше действия по воспроизведению, образец приложения выглядит замороженным (я только что попробовал его с образцом BasicHLSL из пакета SDK за март 2009 г.)

Каким образом приложение должно реагировать на это? Существуют ли другие условия, которые должны прекратить «модальный цикл перемещения или изменения размера» ?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2010

Я знаю, что уже довольно поздно, но это все еще может помочь вам - и, вероятно, поможет другим, кто найдет его в поиске, как я.

Похоже, что в упомянутой вами ситуации сообщение WM_CAPTURECHANGED отправляется, когда изменение размера "отменено". После обширного тестирования кажется, что это всегда отправляется непосредственно перед тем, как WM_EXITSIZEMOVE (или должно быть!), И ни на каком другом этапе между WM_ENTERSIZEMOVE / WM_EXITSIZEMOVE.

Сообщение WM_CAPTURECHANGED отправляется и в другое время, поэтому вы должны реагировать на него только в том случае, если сообщение WM_ENTERSIZEMOVE было отправлено, а следующее WM_EXITSIZEMOVE - нет.

0 голосов
/ 01 декабря 2009

Вы должны получать сообщение WM_SIZE каждый раз, когда завершается операция определения размера. И при определении размера вы получите сообщения WM_SIZING.

Может быть, вы тоже можете использовать их, чтобы приостановить приложение?

0 голосов
/ 01 декабря 2009

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

Такое решение пахнет для меня, хотя. Я бы скорее понял, как это должно работать, чем полагаться только на ограниченное тестирование.

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