![]() |
|
|
![]()
|
|
| FApe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
Проблема в следующем в программе динамически создаются объекты типа CButton а их события соответственно отлавливаются обработчиком OnCommand
Возникла необходимость изменить CButton после замены на CMyBytton
такого вот вида OnCommand перестал видеть события нажатия на кнопку в чем причина кто знает ? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Какого вида OnCommand перестал видеть события?
Скорее всего, ты что-то неправильно заменил. Приведи кусок кода - как было раньше (создавались кнопки) и как сейчас. Ну и OnCommand тоже. -------------------- ... |
|||
|
||||
| FApe |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
было
стало
событие ловлю так
|
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Это не диалог перестал ловить команды, а, скорее всего, кнопка перестала их посылать.
Если бы ты определил CMyButton, как написал в первом посте (т.е. пустой класс), то ничего бы не изменилось. Можешь проверить. Но класс у тебя вряд ли пустой, иначе зачем бы его делать. Стало быть, ты накосячил с переопределением функций, раз кнопка перестала посылать уведосления. Скорее всего, где-то в районе обработчиков кнопок мыши. Убедись, что там везде вызывается стандартный обработчик (т.е. Default). Если сразу ошибку не найдешь, начни с того, что полностью закомментируй свои. переопределенные обработчики и добейся того, чтобы уведомления стали приходить. Потом открывай по одному и проверяй, пока не найдешь гада. -------------------- ... |
|||
|
||||
| FApe |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
Первым что я сделал когда потерял сообщения от CMyButton это попробовал вернутся ли они если класс CMyButton примет вид
к сожалению это проблеммы не решило да и кнопка "интерактивна" фокус наводится кнопка перерисовывается с отжатой на нажатую а OnCommand сообщений с ее идентификатором не получает Это сообщение отредактировал(а) FApe - 11.6.2010, 08:53 |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Тогда вернись еще на шаг и создавай просто кнопки. И не принимай ничего как "очевидное".
Косяк явно есть - не может быть, чтобы простое переименование класса привело к изменению поведения. Кроме того, отладка с помощью MessageBox - это такой дикий дилетантизм, что даже обсуждать не хочется. У тебя отладчик есть, вот и пользуйся им. Проверь, что ты вообще в этот OnCommand попадаешь. -------------------- ... |
|||
|
||||
| FApe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
Рядом с кнопкой CMyButton стоят в ровненький рядок еще ТРИ CButton с которыми никаких проблем их (CBotton) события в OnCommand попадают нормально Я собственно переделал одну из них и как только обнаружил непопадание OnCommand СРАЗУ ЖЕ вычистил из CMyButton ВСЕ приведя ее к виду class CMyButton : public CButton { public: protected: }; простое переименование уже не раз проводил эксперимент брал любую "здоровую" кнопку и менял одну строчку CButton* button = new CButton; на CMyButton* button = new CMyButton; и все больше ничего не трогаю руками компилю не дыша и получаю ГЛУХУЮ к моим просьбам кнопку Это сообщение отредактировал(а) FApe - 11.6.2010, 11:13 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Вообще-то я предлагала тебе заменить new CButton в переделанной кнопке на CButton и убедиться, что сообщения вернутся. Или нет. И призывала не доверять "очевидному". Но ты не понял, видимо.
Ладно. Посмотри Спаем на свой Button, который My. Класс у него все еще Button? (должен быть.) Если да, то поставь в Спае фильтр на сообщения кнопке и ее родителю, и выбери только WM_LBUTTONDOWN \ UP и WM_COMAND. Нажимай кнопку и смотри. Можешь с другими сравнить. Должно быть примерно так: DOWN, UP кнопке, затем COMMAND родителю. Если все так, ставь точку прерывания в самое начало OnCommand (а не внутрь if). Если клаcc не Button, то надо выяснить почему. Во первых, кто: спай покажет. Во-вторых - почему: иди отладчиком в Create. Кстати, что это за идентификатор такой - idIx? Выглядит как глобальная переменная. У тебя что, все кнопки с одинаковыми ID? -------------------- ... |
|||
|
||||
| FApe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
нет конешно idIx от ID IndeX обычный int инкрементируемый после создания каждого объекта Button так что каждая кнопка имеет свой уникальный ID Закралась ошибочка в мое объяснение кнопки создавались c поднятым флагом BS_OWNERDRAW вот если этого флага нет то OnCommand видит событие нажатия на кнопку а если флаг установлен то событие не приходит а мне этот флаг нужно поднять что делать как побороть ? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ясно. Дело в том, что стиль OwnerDraw исключает все остальные, в том числе и Checkbox. Т.е. либо Ownerdraw и "просто кнопка", либо checkbox и прочая. И я таки не поняла, нужен тебе OwnerDraw или нет. Если нужен, то кнопки придется делать обычными (push-button), а поведение check-box эмулировать самому. В принципе, это несложно: запоминаешь сам текущее состояние в классе кнопки и сам обрабатываешь сообщения типа SetCheck. В библиотеке BCGPro кнопки с красотами реализованы именно так.
-------------------- ... |
|||
|
||||
| FApe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
Именно так я и делаю написал свой Get/SetCheck и запоминаю состояние но только наследую CMyButton не от CButton а от CBitmapButton что бы не возится с перерисовкой ... но это не решает проблему отсутствия сообщения о нажатии в OnCommand хотя поясни пожалста что значит обработка сообщения типа SetCheck я переопределил эту функцию в своем классе но видимо надо еще что то сделать ? (в MFC я все таки не эксперт работаю интуитивно натыкаясь на препядствия |
|||
|
||||
| Earnest |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нужно убрать отсюда все BS-стили и оставить только BS_OWNERDRAW (которого почему-то здесь нет)
Состояние кнопки управляется сообщениями BM_GETCHECK \ BM_SETCHECK. Именно эти сообщения посылаются из функций CButton::GetCheck \ SetCheck. Но они работают только для кнопок со стилем Check или Radio. А OwnerDraw-кнопки не могут иметь такие стили. Бессмысленно переопределять функции SetCheck\ GetCheck (т.к. это будет работать только при явном вызове из твоего кода). Нужно переопределить именно обработку BM_GETCHECK И BM_SETCHECK.
Это мне совсем непонятно, что там с уведомлениями происходит, поскольку ничего такого BitmapButton не делает. Нужно тупо поставить точку прерывания на OnCommand и смотреть, что приходит при нажатии на кнопку. Возможно, к команде примешивается какой-то левый код уведомления вместо BN_CLICKED. Спаем, как я поняла, ты не смотрел. А зря. -------------------- ... |
||||||||
|
|||||||||
| FApe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
уфф нашел
вобщем OnCommand все увидел проблема решена кнопки заработали в нормальном режиме Earnest спасибо тебе огромное за будиское терпение и труд по ликвидации безграмотности с тобой этот мир лучше еще раз прошу прощения за потраченное на выявление "фантомной" проблемы время |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |