![]() |
|
![]() ![]() ![]() |
|
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
У меня такой вопрос : вот есть у меня несколько кнопок. У них должна быть разная реакция на события (OnMouseMove, OnClick, OnLDblClk и т.п.) Стоит ли заводить под каждую кнопку отдельный класс (порожденный от CButton)? Если да, то в большом проекте получится, наверное, около 40 классов (нормально ли это?). Если нет, то какими средствами лучше пользоваться, для различия событий?
|
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Нет...
В обработчике ОДНОГО класса делаешь
или switch Так я делаю, по крайней мере Это сообщение отредактировал(а) Coocky - 13.2.2006, 15:43 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Спасибо большое, очень долго мучился
Кстати, GetDlgCtrlID() используется только если я использую Диалог или в любом случае (для любого окна) ? Это сообщение отредактировал(а) xTr1m - 13.2.2006, 18:26 |
|||
|
||||
Coocky |
|
||||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Для любого окна.. А вот если создаешь диалог динамически, но на основе шаблона, тогда я делаю так
Добавлено @ 18:42 Да, забыл добавить
Т.е. только если на диалоге..Вроде так..Если верить МСДН или если я правильно перевел.. В любом случае по другому я не пользовался.. ![]() Добавлено @ 18:46 А нет...неправильно перевел ![]()
![]() Это сообщение отредактировал(а) Coocky - 13.2.2006, 18:35 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
||||||
|
|||||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
А можно еще один вопросик
![]() Вот в первом примере (там где на основе if или switch) это работает, если кнопки создаются самостоятельно (т.е. без помощи редактора) А как быть, если я содал проект на основе диалога, кинул на него, скажем, 2 кнопки. Тогда ведь получается, что эти кнопки от CButton, а как мне привязать их к своему классу CMyButton и использовать свои события (OnMouseMove и т.п.) ? |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Coocky, за switch я бы отрывал руки.
xTr1m, нажатие на кнопку обрабатывается(обычно) в родителе этой кнопки -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
DeadSoul,
что-то я не понял... А какие проблемы? Что за "рукоотрывание" ![]() Я не понял- а ну-ка приведи свой вариант.. ![]() Добавлено @ 11:56
Очень просто..Просто в обьывление класса диалога заменяешь CButton на CMyButton..И все ![]() Это сообщение отредактировал(а) Coocky - 14.2.2006, 11:57 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
За switch надо отрывать руки. Есть два варианта: - несколько полиморвных классов - switch Не надо выбирать switch. Полиморвизм для этого и придуман. Ты предстваляешь объем кода в который разрастется этот switch? Добавлено @ 22:08 xTr1m, ты уверен, что все это не нужно обрабатывать в окне-родителе твоих кнопок? Обычно у кнопки недостаточно данных, чтобы обработать клик -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
WERITAS |
|
|||
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
xTr1m,
А вообще странно...Если в приложении 40 кнопок, то я бы, скорей всего, писал бы его в С++ Builder ![]() -------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
Aveic |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 9.2.2006 Где: Да все мы из одно й ямы Репутация: нет Всего: нет |
Я за DeadSoul'а. Я так всегда и делал. Однако, это касается только кликов. Остальные сообщения в среднем случае лучше делать через switch. А еще лучше не придумывать таких разнообразных кнопок, а придумать новый элемент управления, который некоторым образом инкапсулирует эти кнопки, с таким разным поведением. Несмотря на все проблемы такой реализации, есть хоть одно преимущество - возможность повторного использования данной компоненты.
![]() |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
![]() Несколько? ![]() Если 40 кнопок с разной отработкой, сколько-несколько классов?
Ты че -травишь? ![]() А ну покажи пример, как ты СВОЕЙ полиморфностью уменьшищь код? Создашь 39 производных классов? Можешь присоединятся к показу примера.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
DeadSoul прав.
В общем случае вариант с разными классами лучше: поведение должно быть инкапсулировано. Большие switch'и с ~40 вариантами очень трудно поддерживать. А уж смотреть на них просто тошно. Какая разница, сколько классов? 40 классов для большого приложения - смешная цифра. 400 - уже ближе... Но это теория. А на практике - не могу себе представить 40 вариантов поведения кнопки на MouseMove или Click. Подозреваю, что имеется в виду что-то типа - выводить разные сообщения, вызывать разные функции обработки. Если так - то достаточно, конечно, одного класса без всяких свичей. Обработка кликов обычно поручается родителю (или фрейму), как уже было сказано. Что касается MouseMove и других сообщений - зависит от задачи. Так что, спецификацию - в студию! Это сообщение отредактировал(а) Earnest - 15.2.2006, 20:56 -------------------- ... |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Я лишь предложил свой вариант. ИМХО я не представляю 40 разных кнопок, но вот была ситуация, когда два обьекта одного класса должны были вести себя немного по разному, при определенном действии. Я испоьзовал их индефикатор при разделении действий. Я слабо себе представляю, как можно не запутаться в ;) классах(3 часа уйдет на выдумывание имен классов). Я представляю, время, которое уйдет на копи-пасте кода, который уйдет на отрисовку. Никто не спорит, что "правильно" делать так ,как надо, а не так ,как ненадо (Вини-Пух ![]() ЭТО мое ИМХО.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Coocky, соглас.
Тем более, что можно в этом классе завести переменную BYTE m_switch_data и при Create ставить нужный номер, ну а дальше как Coocky, прописал. Coocky, че ты себя в старики то записываешь со своим Высоцким? С сигаретой, понимаешь ли? ![]() ![]() ![]() -------------------- я не гольфист - я хоккеист |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Весь вопрос в том, что понимается под
Вариант 1. При (например) дабл-клике одна кнопка должна три раза подпрыгнуть и пять раз свистнуть. А вторая - показать какой-нибудь диалог для настройки какого-нибудь ресурса. Тут вопросов нет - два разных класса с общей базой (которая в лице CButton) уже есть. Вариант 2. При том же дабл-клике первая кнопка должна вызвать процедуру F1, а вторая - - тоже вызвать процедуру, но F2. Тут тоже вопросов нет - обойдемся параметризацией. Coocky, ты, между прочим, совершенно прав: удачные имена классов - это половина хорошего дизайна. А копи-паст кода - это проблема программиста, хороший дизайн этого избегает. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |