WM_SIZE не получен при изменении размера windows - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть довольно простая windows программа, которая создала элемент управления listview, который должен точно заполнить клиентскую область. Это работает при запуске, и я думаю, что будет работать, если окно изменено в размере - за исключением того, что windows НИКОГДА не получает никаких сообщений WM_SIZE (после исходного, отправленного при создании окна). Я проверил это, используя Spy ++ x64 в качестве администратор, чтобы я все захватывал. Spy ++ показал окно, получающее WM_SIZING, WM_WINPOSCHANGED, WM_NCCALCSIZE и WM_WINPOSCHANGING (этот список не в каком-либо определенном порядке), но НИКОГДА не WM_SIZE.

Это 64-битная программа, но я не знаю почему это должно иметь значение.

Итак, могу ли я что-то сделать, чтобы окно могло быть полностью изменяемого размера, но не позволяло Windows генерировать сообщения WM_SIZE, когда это происходит? Если нет, то нужно ли мне что-то делать (чего не требовалось в последние 30 лет), чтобы Windows знал, что мне нужно увидеть эти события WM_SIZE?

1 Ответ

0 голосов
/ 06 апреля 2020

Оказывается, что оконная процедура по умолчанию генерирует WM_SIZE при обработке WM_WINDOWPOSCHANGED и, поскольку я обрабатывал WM_WINDOWPOSCHANGED, сообщения о размере не создавались. Поэтому я перенаправил сообщение об изменении позиции в обработчик по умолчанию, и сообщения вернулись.

Это следует задокументированному поведению. В документации WM_WINDOWPOSCHANGED есть примечание :

По умолчанию функция DefWindowPro c отправляет WM_SIZE и WM_MOVE сообщений в окне. Сообщения WM_SIZE и WM_MOVE не отправляются, если приложение обрабатывает сообщение WM_WINDOWPOSCHANGED без вызова DefWindowProc. Более эффективно выполнять любое перемещение или обработку изменения размера во время WM_WINDOWPOSCHANGED сообщение без вызова DefWindowProc.

Да, мне жаль признаться, что я не смог прочитать документацию для всех сообщений Window, которые я НЕ возникли проблемы с тем, когда мне нужно было узнать о WM_SIZE. Глупый я за то, что я не предполагал, что документация, необходимая мне для WM_SIZE, была найдена только под другим сообщением! Все, что он говорит о генерации сообщений в документации WM_SIZE:

Отправляется в окно после изменения его размера.

ВООБЩЕ не упоминается ни о какой зависимости на обработку по умолчанию для РАЗЛИЧНОГО сообщения, которое будет найдено. Э-э go, поведение фактически недокументировано, тем более что это может быть критически важной информацией, как это было для меня.

О, хорошо, я сдаюсь, это место стало слишком большим количеством просто шлепать людей вниз для того, чтобы задавать вопросы, некоторые люди думают, что на них слишком легко ответить. Постарайтесь запомнить, что не у всех есть память eideti c и доступ ко всей документации, которую вы все запомнили. Некоторые из нас ищут то, над чем мы работаем, и ожидаем найти важные детали об этом. ОНИ НЕТ. Bye!

...