Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnCommand не видит событие 
V
    Опции темы
FApe
Дата 10.6.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



Проблема в следующем в программе динамически создаются объекты типа CButton а их события соответственно отлавливаются обработчиком OnCommand
Возникла необходимость изменить CButton после замены на CMyBytton
Код


class CMyButton : public CButton
{
public:
    
protected:
};


такого вот вида OnCommand перестал видеть события нажатия на кнопку 
в чем причина кто знает ?

PM MAIL   Вверх
Earnest
Дата 10.6.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Какого вида OnCommand перестал видеть события?
Скорее всего, ты что-то неправильно заменил. Приведи кусок кода - как было раньше (создавались кнопки) и как сейчас. Ну и OnCommand тоже.


--------------------
...
PM   Вверх
FApe
Дата 10.6.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



   
было
Код


CButton button = new CButton;
button->Create(_T("0"), WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, CRect(0, 0, 0, 0), this, idIx);

    

стало
Код


CMyButton button = new CMyButton;
button->Create(_T("0"), WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, CRect(0, 0, 0, 0), this, idIx);



событие ловлю так
Код


BOOL CMyDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
    if (wParam == idIx)
    {
        MessageBox(_T("key"));
    }

        return CDialog::OnCommand(wParam, lParam);
}





PM MAIL   Вверх
Earnest
Дата 10.6.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Это не диалог перестал ловить команды, а, скорее всего, кнопка перестала их посылать.
Если бы ты определил CMyButton, как написал в первом посте (т.е. пустой класс), то ничего бы не изменилось. Можешь проверить.
Но класс у тебя вряд ли пустой, иначе зачем бы его делать.
Стало быть, ты накосячил с переопределением функций, раз кнопка перестала посылать уведосления.
Скорее всего, где-то в районе обработчиков кнопок мыши. 
Убедись, что там везде вызывается стандартный обработчик (т.е. Default).
Если сразу ошибку не найдешь, начни с того, что полностью закомментируй свои. переопределенные обработчики и добейся того, чтобы уведомления стали приходить. Потом открывай по одному и проверяй, пока не найдешь гада.



--------------------
...
PM   Вверх
FApe
Дата 11.6.2010, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 10.6.2010,  19:30)
Это не диалог перестал ловить команды, а, скорее всего, кнопка перестала их посылать.
Если бы ты определил CMyButton, как написал в первом посте (т.е. пустой класс), то ничего бы не изменилось. Можешь проверить.
Но класс у тебя вряд ли пустой, иначе зачем бы его делать.
Стало быть, ты накосячил с переопределением функций, раз кнопка перестала посылать уведосления.
Скорее всего, где-то в районе обработчиков кнопок мыши. 
Убедись, что там везде вызывается стандартный обработчик (т.е. Default).
Если сразу ошибку не найдешь, начни с того, что полностью закомментируй свои. переопределенные обработчики и добейся того, чтобы уведомления стали приходить. Потом открывай по одному и проверяй, пока не найдешь гада.

Первым что я сделал когда потерял сообщения от CMyButton это попробовал вернутся ли они если класс CMyButton примет вид

Код

    
class CMyButton : public CButton
{
public:
    
protected:
};

   smile 

к сожалению это проблеммы не решило  smile 

да и кнопка "интерактивна" фокус наводится кнопка перерисовывается с отжатой на нажатую а OnCommand сообщений с ее идентификатором не получает  smile 

Это сообщение отредактировал(а) FApe - 11.6.2010, 08:53
PM MAIL   Вверх
Earnest
Дата 11.6.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Тогда вернись еще на шаг и создавай просто кнопки. И не принимай ничего как "очевидное".
Косяк явно есть - не может быть, чтобы простое переименование класса привело к изменению поведения.

Кроме того, отладка с помощью MessageBox - это такой дикий дилетантизм, что даже обсуждать не хочется. У тебя отладчик есть, вот и пользуйся им. Проверь, что ты вообще в этот OnCommand попадаешь. 



--------------------
...
PM   Вверх
FApe
Дата 11.6.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 11.6.2010,  10:55)
Тогда вернись еще на шаг и создавай просто кнопки. И не принимай ничего как "очевидное".
Косяк явно есть - не может быть, чтобы простое переименование класса привело к изменению поведения.

Кроме того, отладка с помощью MessageBox - это такой дикий дилетантизм, что даже обсуждать не хочется. У тебя отладчик есть, вот и пользуйся им. Проверь, что ты вообще в этот OnCommand попадаешь.

Рядом с кнопкой CMyButton стоят в ровненький рядок еще ТРИ CButton с которыми никаких проблем их (CBotton) события в OnCommand попадают нормально 

Я собственно переделал одну из них и как только обнаружил непопадание OnCommand СРАЗУ ЖЕ вычистил из CMyButton ВСЕ приведя ее к виду

class CMyButton : public CButton
{
public:
    
protected:
};

простое переименование  smile  и больше ее событий не видел

уже не раз проводил эксперимент брал любую "здоровую" кнопку и менял одну строчку

CButton* button = new CButton;

на

CMyButton* button = new CMyButton;

и все больше ничего не трогаю руками компилю не дыша и получаю ГЛУХУЮ к моим просьбам кнопку






Это сообщение отредактировал(а) FApe - 11.6.2010, 11:13
PM MAIL   Вверх
Earnest
Дата 11.6.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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?



--------------------
...
PM   Вверх
FApe
Дата 11.6.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 11.6.2010,  14:47)
Кстати, что это за идентификатор такой - idIx? Выглядит как глобальная переменная. У тебя что, все кнопки с одинаковыми ID?

нет конешно idIx от ID IndeX обычный int инкрементируемый после создания каждого объекта Button так что каждая кнопка имеет свой уникальный ID 

Закралась ошибочка в мое объяснение  кнопки создавались c поднятым флагом BS_OWNERDRAW 
вот если этого флага нет то OnCommand видит событие нажатия на кнопку а если флаг установлен то событие не приходит

а мне этот флаг нужно поднять что делать как побороть ?
PM MAIL   Вверх
Earnest
Дата 15.6.2010, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Ясно. Дело в том, что стиль OwnerDraw исключает все остальные, в том числе и Checkbox. Т.е. либо Ownerdraw и "просто кнопка", либо checkbox и прочая. И я таки не поняла, нужен тебе OwnerDraw или нет. Если нужен, то кнопки придется делать обычными (push-button), а поведение check-box эмулировать самому. В принципе, это несложно: запоминаешь сам текущее состояние в классе кнопки и сам обрабатываешь сообщения типа SetCheck. В библиотеке BCGPro кнопки с красотами реализованы именно так.


--------------------
...
PM   Вверх
FApe
Дата 15.6.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 15.6.2010,  06:51)
Ясно. Дело в том, что стиль OwnerDraw исключает все остальные, в том числе и Checkbox. Т.е. либо Ownerdraw и "просто кнопка", либо checkbox и прочая. И я таки не поняла, нужен тебе OwnerDraw или нет. Если нужен, то кнопки придется делать обычными (push-button), а поведение check-box эмулировать самому. В принципе, это несложно: запоминаешь сам текущее состояние в классе кнопки и сам обрабатываешь сообщения типа SetCheck. В библиотеке BCGPro кнопки с красотами реализованы именно так.

Именно так я и делаю  написал свой Get/SetCheck и запоминаю состояние  smile (ну не первый год замужем  smile )

но только наследую CMyButton не от CButton а от CBitmapButton что бы не возится с перерисовкой ... но это не решает проблему отсутствия сообщения о нажатии в OnCommand

хотя поясни пожалста что значит  обработка сообщения типа SetCheck я переопределил эту функцию в своем классе но видимо надо еще что то сделать ? (в MFC я все таки не эксперт работаю интуитивно натыкаясь на препядствия  smile )
PM MAIL   Вверх
Earnest
Дата 15.6.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(FApe @  15.6.2010,  10:11 Найти цитируемый пост)
Именно так я и делаю  написал свой Get/SetCheck и запоминаю состояние


Цитата(FApe @  10.6.2010,  18:06 Найти цитируемый пост)
CMyButton button = new CMyButton;
button->Create(_T("0"), WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, CRect(0, 0, 0, 0), this, idIx);

Нужно убрать отсюда все BS-стили и оставить только BS_OWNERDRAW (которого почему-то здесь нет)

Цитата(FApe @  15.6.2010,  10:11 Найти цитируемый пост)
хотя поясни пожалста что значит  обработка сообщения типа SetCheck я переопределил эту функцию в своем классе 

Состояние кнопки управляется сообщениями BM_GETCHECK \ BM_SETCHECK. Именно эти сообщения посылаются из функций CButton::GetCheck \ SetCheck. Но они работают только для кнопок со стилем Check или Radio. А OwnerDraw-кнопки не могут иметь такие стили. Бессмысленно переопределять функции SetCheck\ GetCheck (т.к. это будет работать только при явном вызове из твоего кода). Нужно переопределить именно обработку BM_GETCHECK И BM_SETCHECK.
Цитата(FApe @  15.6.2010,  10:11 Найти цитируемый пост)
 но это не решает проблему отсутствия сообщения о нажатии в OnCommand

Это мне совсем непонятно, что там с уведомлениями происходит, поскольку ничего такого BitmapButton не делает. 
Нужно тупо поставить точку прерывания на OnCommand и смотреть, что приходит при нажатии на кнопку. Возможно, к команде примешивается какой-то левый код уведомления вместо BN_CLICKED.
Спаем, как  я поняла, ты не смотрел. А зря.


--------------------
...
PM   Вверх
FApe
Дата 15.6.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.6.2007

Репутация: нет
Всего: нет



уфф нашел  smile  банальная ошибка копиПасты наложенная на два изменения кода сразу (классика)
вобщем OnCommand все увидел проблема решена кнопки заработали в нормальном режиме

Earnest спасибо тебе огромное за будиское терпение и труд по ликвидации безграмотности с тобой этот мир лучше  smile 
еще раз прошу прощения за потраченное на выявление "фантомной" проблемы время  smile 


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.2870 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.