Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прием сообщения от другого приложения  (Прочитано 9177 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 14-04-2005 07:27 » 

Люди,

ситуация следующая : я посылаю сообщение из одного приложения в другое.
Принимающая сторона - обычное SDI. Если я помещаю обработчик сообщения во View, то обработка не происходит (т.е. сообщение уходит в нирвану  Здесь была моя ладья...). Если же обработчик стоит в MainFrame, то все сразу срабатывает! Отлично Я определила это чисто русским методом тыка, а вот правильного обьяснения этому чуду природы ("Windows" называется  Отлично) не знаю!
Вопрос на засыпку - почему это так? Ведь сообщение посылается всем! А значит, оно должно попадать во все обработчики! Может, кто-то знает? Или я делаю что-то не так?

Для обоих приложений есть общий хедер - фаил, в котором стоит:
Код:
const CString NEW_SHOWTYPE_MSG_STR = "NEW_SHOWTYPE_MSG";
const UINT NEW_SHOWTYPE_MSG = ::RegisterWindowMessage(NEW_SHOWTYPE_MSG_STR);

На стороне, посылающей сообщение, стоит :

::PostMessage(HWND_BROADCAST, NEW_SHOWTYPE_MSG, (WPARAM)m_nMWShowType, (LPARAM)NULL);

На принимающей :

ON_REGISTERED_MESSAGE (NEW_SHOWTYPE_MSG , OnNewShowTypeMsg)
...
LRESULT CMainFrame::OnNewShowTypeMsg(WPARAM wParam , LPARAM lParam)
{...}

Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 14-04-2005 07:49 » 

У ентого чуда есть свойство, сообщения принимаются окном имеющим фокус (эт что касается ввода мышь, клава). Для других сообщений - существует иерархия. Поэтому сначала сообщения получает CMainFrame. Просто отправь его дальше в View.
Или вызови напрямую ф-ю обработки из View.

GetActiveView()->SendMessage(NEW_SHOWTYPE_MSG, wParam , lParam);
или
((CMyView*)GetActiveView())->MyFunc(wParam , lParam);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 14-04-2005 09:26 » 

Джон,

Ты понимаешь, я как раз так и сделала (ну надо ведь было выкручиваться Ага ), но никак не могла понять, почему! Т.е. по моему дурному разумению если сообщение идет ко всем (HWND_BROADCAST), то и получать должны все (без фильтрации, как это делает CMainFrame, насколько я поняла).
Я уже думала, что что-то не так делаю! теперь я спокойна - все правильно!
Еще раз спасибо за обЪяснение!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 14-04-2005 15:15 » 

Иерархия нужна для упорядочивания обработки. Обычно родительское окно  отправляет сообщение "детям" - кто-нить да и обработает. А инече проблемма с синхронизацией получится - пример - закрытие приложения.
Сначала OnClose выполняестя в самом "глубоком" окне. А уж потом основное окно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 15-04-2005 07:16 » 

Джон,

теперь ты меня запутал еще больше Ага
Обычно сообщение получает родительское окно, которое сначала проверяет, должно ли оно само это сообщение обработать. Если да - то оно этим и занимается, а если нет - отправляет деткам на конфетки, т.е. теперь окна - "дети" просматривают сами это сообщение на предмет обработки и в случае, если это сообщение их не интересует, посылает своим "детям". Т.е. происходит фильтрация с последующей передачей дальше по цепочке.
Если это так для всех сообщений, то и сообщение, посланное другим приложением, должно было бы идти этим путем - основной Frame вясняет, что это не его сообщение и посылает нижестоящим для ознакомления и обработки. Но ведь в этом случае так не происходит!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 15-04-2005 10:24 » 

Jein, Улыбаюсь Я не сказал, что происходит сначала, что потом. Я сказал, что сообщение будет передано дальше.

Кончно зависит от типа сообщения. Если это сообщение исключительно для МЕНЯ, то тогда конечно зачем отправлять его "деткам"?
Рассмотри пример закрытия окна - WM_CLOSE. Основное окно должно сначала "закрыть" всех деток (котрые как правило хранят укзатели pParent), а уж потом самому закрываться.
При создании окна - происходит всё наоборот. Сначало должно бвть создано родительское окно (контейнер), говоря другими словами - должет существовать валидный HWND.
А уж потом сообщение будет передано дальше - для создания деток.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 15-04-2005 11:30 » 

Джон,

во-первых, обожаю это немецкое слово! при всем своем богатстве наш родной и могучий таким одновременно емким и коротким словом не обладает Ага
Теперь по существу - если родительское окно видит, что сообщение ИМЕННО для него, оно его себе тихо обрабатывает и никому не отдает. Тут все ОК. Если же сообщение не его, он его отправляет дальше по служебной лестнице Ага Что опять же верно.

Мое сообщение идет для всех окон как HWND_BROADCAST, т.е. папа его получает, выясняет, что это не его и теоретически должен отдать другим на рассмотрение / растерзание Ага Но этого не происходит! Вместо этого родительское окно просто оставляет это сообщение нагло у себя!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 17-04-2005 14:10 » 

Кинь мне код на мыло.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines