Уважаемые господа! Если кто-то может дать совет, не откажите!
Как отловить сообщение от клиентского окна в MDI-приложении?
От фрейма - понятно, но его почти весь закрывает клиент. От MDI-окон тоже понятно. К примеру, нажатие на клиенте в месте, где нет дочернего MDI-окна не генерирует WM_RBUTTONCLICK, и в WM_COMMAND не могу споймать? Так же и с отлавливанием клавиш.
Клиент ведь должен посылать что-то фрейму как родительскому окну? Как это отловить?
Помогите советом, кто может. Заранее спасибо.
Как отловить сообщение от клиентского окна в MDI-приложении
Модератор: Andy
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Я не в курсе кидает ли MDI Client какие-то нотификации своему фрейму. Посмтри с помощью Spy++ - должно помочь. Если всё же не кидает, то у нас всегда остаётся крайний выход - отсабклассить MDI Client.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Можно поподробней, плз. Я начинающий, ваще-то. Надо просто срочно контрольную закончить. Я решил на асме сделать, заодно его изучить и вот завяз. А сессия буквально на днях.
Виталий
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Spy++ - это тулза входящая в поставку Visual C++. Она позволяет отслеживать любые сообщения и нотификации для конкретно выбранного окна. Запусти любое MDI приложение, потом Spy. Найди окно фрэйма и отследи прихоит ли ему что-либо при клике по клиенту.
Если приходит - твоя проблема решена. Достаточно только добавить соответствующий хэндлер в WindowProc фрэйма.
Если ничего не приходит то сабклассим клиента. Для это нужно предварительно запомнить адрес WindowProc клиента в некоторую переменную (естественно после создания клиента), затем установить вместо указателя на его родную WindowProc, указатель на новую WindowProc (созданную тобой), которая должна обрабатывать всё, что тебе нужно (возможно кидать какие-то нотификации или выполнять действия), а затем директить вызов в старую WindowProc клиента (это очень важно!). Вот и всё.
Получить/установить адрес WindowProc любого окна можно с помощью API GetWindowLongPtr (SetWindowLongPtr) с параметром GWLP_WNDPROC.
Если приходит - твоя проблема решена. Достаточно только добавить соответствующий хэндлер в WindowProc фрэйма.
Если ничего не приходит то сабклассим клиента. Для это нужно предварительно запомнить адрес WindowProc клиента в некоторую переменную (естественно после создания клиента), затем установить вместо указателя на его родную WindowProc, указатель на новую WindowProc (созданную тобой), которая должна обрабатывать всё, что тебе нужно (возможно кидать какие-то нотификации или выполнять действия), а затем директить вызов в старую WindowProc клиента (это очень важно!). Вот и всё.
Получить/установить адрес WindowProc любого окна можно с помощью API GetWindowLongPtr (SetWindowLongPtr) с параметром GWLP_WNDPROC.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.