Страница 1 из 1

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

Добавлено: 06 фев 2006, 13:46
Sertak
Уважаемые господа! Если кто-то может дать совет, не откажите!
Как отловить сообщение от клиентского окна в MDI-приложении?
От фрейма - понятно, но его почти весь закрывает клиент. От MDI-окон тоже понятно. К примеру, нажатие на клиенте в месте, где нет дочернего MDI-окна не генерирует WM_RBUTTONCLICK, и в WM_COMMAND не могу споймать? Так же и с отлавливанием клавиш.
Клиент ведь должен посылать что-то фрейму как родительскому окну? Как это отловить?
Помогите советом, кто может. Заранее спасибо.

Добавлено: 07 фев 2006, 13:36
Romeo
Я не в курсе кидает ли MDI Client какие-то нотификации своему фрейму. Посмтри с помощью Spy++ - должно помочь. Если всё же не кидает, то у нас всегда остаётся крайний выход - отсабклассить MDI Client.

Добавлено: 07 фев 2006, 22:38
Sertak
Можно поподробней, плз. Я начинающий, ваще-то. Надо просто срочно контрольную закончить. Я решил на асме сделать, заодно его изучить и вот завяз. А сессия буквально на днях.

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

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

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

Получить/установить адрес WindowProc любого окна можно с помощью API GetWindowLongPtr (SetWindowLongPtr) с параметром GWLP_WNDPROC.