Как отловить сообщение от клиентского окна в MDI-приложении

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Sertak
Сообщения: 2
Зарегистрирован: 06 фев 2006, 11:53

Уважаемые господа! Если кто-то может дать совет, не откажите!
Как отловить сообщение от клиентского окна в MDI-приложении?
От фрейма - понятно, но его почти весь закрывает клиент. От MDI-окон тоже понятно. К примеру, нажатие на клиенте в месте, где нет дочернего MDI-окна не генерирует WM_RBUTTONCLICK, и в WM_COMMAND не могу споймать? Так же и с отлавливанием клавиш.
Клиент ведь должен посылать что-то фрейму как родительскому окну? Как это отловить?
Помогите советом, кто может. Заранее спасибо.
Виталий
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я не в курсе кидает ли MDI Client какие-то нотификации своему фрейму. Посмтри с помощью Spy++ - должно помочь. Если всё же не кидает, то у нас всегда остаётся крайний выход - отсабклассить MDI Client.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sertak
Сообщения: 2
Зарегистрирован: 06 фев 2006, 11:53

Можно поподробней, плз. Я начинающий, ваще-то. Надо просто срочно контрольную закончить. Я решил на асме сделать, заодно его изучить и вот завяз. А сессия буквально на днях.
Виталий
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Spy++ - это тулза входящая в поставку Visual C++. Она позволяет отслеживать любые сообщения и нотификации для конкретно выбранного окна. Запусти любое MDI приложение, потом Spy. Найди окно фрэйма и отследи прихоит ли ему что-либо при клике по клиенту.

Если приходит - твоя проблема решена. Достаточно только добавить соответствующий хэндлер в WindowProc фрэйма.

Если ничего не приходит то сабклассим клиента. Для это нужно предварительно запомнить адрес WindowProc клиента в некоторую переменную (естественно после создания клиента), затем установить вместо указателя на его родную WindowProc, указатель на новую WindowProc (созданную тобой), которая должна обрабатывать всё, что тебе нужно (возможно кидать какие-то нотификации или выполнять действия), а затем директить вызов в старую WindowProc клиента (это очень важно!). Вот и всё.

Получить/установить адрес WindowProc любого окна можно с помощью API GetWindowLongPtr (SetWindowLongPtr) с параметром GWLP_WNDPROC.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить