![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
ProfessorLoL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.4.2013 Репутация: нет Всего: нет |
Всем привет. Есть некая библиотека, в которой осуществляется вся работа с окном и событиями. В этой библиотеки главным классом является класс CApplication. Он создает окно, получает события ввода и отсылает сообщения всем слушателям, которые подписались на их получения. Есть класс CAppListener. Именно наследники этого класса могут подписываться на получения сообщений от CApplication.
Приведу немного кода, а затем задам собственно вопрос:
Вся система прекрасно работает. Все контролы созданные таким образом и включенные в иерархию получают события от клавиатуры и мыши. Но возникла необходимость оповестить все контролы о каком-то событии, которое произошло при обработке какого-то конкретного контрола. Допустим ткнули мышкой -> бежим по иерархии контролов и ищем того, кому предназначено сообщение -> обрабатываем сообщение в контроле и ВОТ ТУТ НАДО ПОСЛАТЬ КАКОЕ-ТО СООБЩЕНИЕ ВСЕМ КОНТРОЛАМ. Проблема в том, что отсылать сообщение может только объект класса CApplication. Но доступа в контроле мы к нему не имеем. Помогите. |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Я так понял, всем контролам, которые подписаны на сообщения? Или вообще всем контролам в программе? Ну а получить ссылку на него? Он же наверное представлен в виде синглтона? |
|||
|
||||
ProfessorLoL |
|
||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.4.2013 Репутация: нет Всего: нет |
По сути всем вообще котролам. Но, вообще, только объект класса CGUI подписан на сообщения. Именно он получает сообщения от CApplication. А все остальные контролы получают сообщения потому, что являются детьми GUI. Просто идя вниз по иерархии. Таким образом решается проблема "кому принять сообщение от клика мыши, если один элемент закрывает другой."
Таскать в каждом контроле ссылку на CApplication или на СGUI не хотелось бы.. хотя да, это решило бы проблему. Хотелось бы иметь какое-то красивое решение, которое позволило бы отправлять из любого контрола сообщение в CGUI обьект. Это сообщение отредактировал(а) ProfessorLoL - 8.4.2013, 13:06 |
||||
|
|||||
ProfessorLoL |
|
||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.4.2013 Репутация: нет Всего: нет |
Вот, может кому-то будет полезным, если наткнется на топик из поиска по похожей проблеме: В общем, ничего лучшего не придумал, чем таскать в каждом контроле, помимо ссылки на родителя ссылку на CGUI, который является как бы менеджером всей системы интерфейса. Например кнопку теперь можно создать так:
где window это окно в котором кнопка будет рисоваться в координатах 100,100 Ну и собственно проблема отправки сообщений всем контралам решилась. Для того что-бы отправить сообщение, скажем из обработчика кнопки, пишем в нем
и оно запустит рассылку заново всем контролам в программе с этого места, а потом вернется в эту точку. Если же надо послать сообщение только тем контролам, которые являются братьями данного, то тоже самое делается через родителя. Так например можно легко сбрасывать все RadioButton'ы. Щелкаем по одному, посылаем сообщение "UNCHECKED" всем остальным имеющим одного предка с данным, а текущий RadioButton делаем SetChecked(true); |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |