Размер WM не работает должным образом



У меня проблема с WM_SIZE. Я хочу захватить его с помощью PeekMessage (не WndProc). PeekMessage никогда не получает WM_SIZE, поэтому я отправляю дополнительное пользовательское сообщение в окно, чтобы захватить его с помощью PeekMessage, как это (код из WnProc) :



case WM_SIZE:
PostMessageW(hwnd, WM_USER + 1, wParam, lParam);
break;


Проблема в том, что я получаю WM_USER + 1 с помощью PeekMessage только тогда, когда окно развернуто или восстановлено. Нет сообщения, когда окно изменяется по размеру его толстой рамки (хотя я получаю WM_SIZE в WndProc).

614   2  

2 ответов:

PeekMessage() может видеть только те сообщения, которые были отправлены в очередь сообщений. Это исключает WM_SIZE, он отправляется, а не публикуется. Или другими словами, он доставляется SendMessage (), он вызывает процедуру окна напрямую и обходит очередь сообщений. Так что да, ваш код начинает работать, потому что теперь вы перепечатываете сообщение с помощью PostMessage, оно помещается в очередь сообщений, чтобы PeekMessage мог его видеть.

Что-то другое происходит, когда пользователь изменяет размер окна. Об этом сообщает Еще одно сообщение: WM_SIZING. Он генерируется с довольно высокой скоростью, когда Windows запускает модальный цикл сообщений для реализации операции изменения размера. Это дает должное уведомление об этом, вы получите WM_ENTERSIZEMOVE, когда начинается модальный цикл (пользователь нажимает на угол окна), WM_EXITSIZEMOVE, когда он завершен (пользователь отпускает кнопку). Вы получите кучу сообщений WM_SIZING, отправленных в вашу оконную процедуру. Не размещать. И один WM_SIZE, чтобы дать окончательный размер. Один из способов Не видеть эти отраженные версии этих сообщений - это когда вы вызываете PeekMessage () в своем собственном цикле сообщений. Он не будет вызван, когда активен цикл модального изменения размера Windows.

Трудно дать лучший совет, действительно непонятно, зачем вы это делаете. Медицинский ответ" доктор, это больно, не делайте этого тогда", скорее всего, будет уместен. Я подозреваю,что вы также захотите отразить сообщение WM_SIZING. Самая большая проблема заключается в том, что к тому времени, когда вы получаете эти сообщения из очереди, размер окна уже изменился, и уведомление просто устарело. Именно поэтому сообщение отправляется, а не публикуется.

Я полагаю, что это применимо:

PeekMessage не получать сообщения?

Вам нужно передать указатель класса на последний параметр вашего вызова чтобы CreateWindowEx, затем извлеките этот указатель из LPCREATESTRUCT переданный вам в LPARAM WM_CREATE, ваш указатель класса будет в поле lpCreateParmas структуры. Установите указатель класса на GWLP_USERDATA вашего окна, а также при любых других вызовах сообщений , вызов GetWindowsLong , извлеките указатель класса, а затем передайте message, wparam и lparam-все для вашего внутреннего сообщения класса обработчик.

Http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

Comments

    Ничего не найдено.