![]() |
|
|
![]()
|
|
| Darked |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Вообщем нужно создать комбобокс в тулбаре, и, естественно, потом хотелось бы полчать от него сообщения. Пишу в WTL. Создаю в CMainFrame переменную CComboBox m_Combo. Дальше завист от реализации, если создаю так:
то в CMAinFrame сообщения не ловятся.
Если же создаю так:
То сообщения от комбобокса ловяться в CMainFrame. Не понимаю в чем именно различие? Догадываюсь что происходят изменения в маршрутизации сообщений, но как и почему? -------------------- Veni, Vidi, Vici !!! |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Могу только догадаться
что ты в методе create не указываешь родителя. А если класс не может обработать сообщение, то он передает его родителю, и так далее. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Coocky, да нет, первый параметр это hwnd родителя, я его ставлю m_hWndStatusBar. Комбобокс появляется, строки отображаются, но вот сообщения от него не ловятся в базовом классе CMainFrame. Если же я ставлю парентом m_hWnd (хендл CmainFrame), а потом через SetParent устанавливаю родителем статусбар (m_hWndStatusBar), то сообщения начинают ловится в CMainFrame.
-------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А чего бы MainFrame ловил уведомления неизвесно от кого?
Фокус тут в разнице между двумя понятиями - PARENT и OWNER. Парент - это окно, в котором расположен контрол, а OWNER - окно, которому посылаются уведомления. По-умолчанию (после создания) они совпадают. Если m_hWndStatusBar - это твой тулбар, то ему и посылаются сообщения, когда ты создаешь комбобокс первым способом. Можешь их там ловить и пересылать главному окну (автоматически это, конечно, не происходит). Когда ты создаешь комбобокс вторым способом, ты меняешь ему парента, а OWNER'ом остается главное окно, как при создании. Вот оно и получает уведомления. -------------------- ... |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Earnest, то есть я правильно понимаю - во всех функциях create указывается именно owner, и это же значение заодно назначается паренту, который потом можно изменить?
-------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Темное это дело, Darked, если честно. Для child-окон, ИМХО, указывается именно parent, он же owner. А для pop-up окон - owner.
Нигде не встречала, чтобы это дело было подробно изложено. Остается экспериментировать и пользоваться Спаем в сомнительных случаях - он тебе все расскажет, про парентов и owner'ов. В MSDN недавно прочитала, что MFC имеет свою концепцию owner'ов, отличную от концепции "Owned windows" API. У WTL, которой ты пользуешься, тоже может быть своя точка зрения. -------------------- ... |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Earnest, спасибо за объяснение.
-------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 2 Всего: 106 |
неправильно!!!
Овнер есть только тогда, когда стиль WS_POPUP указан, в остальных случаях - это парент, не надо путать. А чтобы ещё и винду не путать, вместо GetParent вызывай GetAncestor -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да, так про owner'ов в MSDN написано. Однако, owner'ы бывают и у child окон - достаточно Спаем посмотреть, на те же тулбары. Кроме того, как я уже писала, у MFC есть свое представление об owner'ах - они могут быть у любого окна ...
-------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 2 Всего: 106 |
Не хочу показаться навязчивым, но подумай, чем отличается парент от овнера? Ну, самое главное отличие: Owned окно, по отношению к Owner'у может находиться вне области Owner'а. А это значит, что парент не может быть овнером в понимании WinAPI. Именно поэтому я изначально предложил использовать именно GetAncestor, а не GetParent. В MSDN'е именно так и написано, если сомневаешься, почитай эту вечную библию программиста. Я уже давно проверил это на практике.
PS:Спай можешь и сама написать. Периодически в этом отношении ошибка с овнером неоднократно замечается программистами, но видно очень быстро забывается, к сожалению. Это сообщение отредактировал(а) GremlinProg - 10.11.2005, 09:42 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |