eVC 4.0, MFC и обработчики событий
От: bkat  
Дата: 12.05.03 13:42
Оценка:
Наткнулся на странную проблему при создании простого MFC приложения
для WinCE. NET.

С некоторых пор перестали вызываться обработчики некоторых событий.
Например, если я добавлю новую кнопку в редакторе ресурсов
и добавлю обработчик нажатия кнопки (ON_BN_CLICKED),
то этот обработчик никогда не вызывается, как бы я не давил на кнопку .

Полный ребилд не помогает...

В чем тут может быть проблема


12.09.03 18:44: Перенесено модератором из 'MFC' — AS
Re: eVC 4.0, MFC и обработчики событий
От: kiamor  
Дата: 12.05.03 13:50
Оценка:
Здравствуйте, bkat.

Ты бы все-таки ручками посмотрел карту сообщений... Если обработчики не вызываются,
значит — нету их. Проверить стоит однако.
Re[2]: eVC 4.0, MFC и обработчики событий
От: bkat  
Дата: 12.05.03 13:56
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Здравствуйте, bkat.


K>Ты бы все-таки ручками посмотрел карту сообщений... Если обработчики не вызываются,

K>значит — нету их. Проверить стоит однако.

Дак в том то и дело, что все есть...
В заголовочном файле:
// Generated message map functions
//{{AFX_MSG(CTestDlg)
virtual BOOL OnInitDialog();
afx_msg void OnButtonMakeTestAction();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()


В cpp файле
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
    //{{AFX_MSG_MAP(CTestDlg)
    ON_BN_CLICKED(IDC_BUTTON_MAKE_TEST_ACTION, OnButtonMakeTestAction)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


Ну и соотвественно сам метод OnButtonMakeTestAction.
Так что все на месте
Re[3]: eVC 4.0, MFC и обработчики событий
От: Serguei666 Беларусь  
Дата: 12.05.03 14:48
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, kiamor, Вы писали:


K>Здравствуйте, bkat.


K>Ты бы все-таки ручками посмотрел карту сообщений... Если обработчики не вызываются,

K>значит — нету их. Проверить стоит однако.

B>Дак в том то и дело, что все есть...

B>В заголовочном файле:
B>
B>// Generated message map functions
B>//{{AFX_MSG(CTestDlg)
B>virtual BOOL OnInitDialog();
B>afx_msg void OnButtonMakeTestAction();
B>//}}AFX_MSG
B>DECLARE_MESSAGE_MAP()
B>


B>В cpp файле

B>
B>BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
B>    //{{AFX_MSG_MAP(CTestDlg)
B>    ON_BN_CLICKED(IDC_BUTTON_MAKE_TEST_ACTION, OnButtonMakeTestAction)
B>    //}}AFX_MSG_MAP
B>END_MESSAGE_MAP()
B>


B>Ну и соотвественно сам метод OnButtonMakeTestAction.

B>Так что все на месте

Комьютер не устает и не ошибается, как та машинка для счета денег.
Если не вызывается — значит есть ошибки в программе.
Например, чему равно IDC_BUTTON_MAKE_TEST_ACTION?
Какой ID имеет кнопка в ресурсах? IDC_BUTTON_MAKE_TEST_ACTION или нет?
Какой ID имеет кнопка в созданном диалоге? Spy++ вам поможет это определить.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: eVC 4.0, MFC и обработчики событий
От: kiamor  
Дата: 13.05.03 05:23
Оценка:
Здравствуйте, bkat.

Дык я и не сомневаюсь, что в исходном коде все есть. Я имел ввиду карту
сообщений в процессе исполнения приложения. Макросы ON_MESSAGE и иже с ними
разворачиваются в определенную структуру. Вот её-то я и рекомендовал посмотреть.
Сравнить адреса в карте и адреса обработчиков.

Кстати, по поводу маршрутизации сообщений в MFC на RSDN была статья. Поищи.
Re[4]: eVC 4.0, MFC и обработчики событий
От: bkat  
Дата: 13.05.03 09:20
Оценка:
Спасибо за отклик, но прошу обратить внимание,
что я спрашиваю про MS eMbedded Visual C++ 4.0,
который имеет свои особенности и баги.

Меня интересует почему при внешне верном коде ничего не работает.
Вот некоторые факты...

С помощью опции "-P" компилятора легко увидеть, что карта памяти
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
    //{{AFX_MSG_MAP(CTestDlg)
    ON_BN_CLICKED(IDC_BUTTON_MAKE_INSTANCE, OnButtonMakeInstance)
    ON_BN_CLICKED(IDC_BUTTON_MAKE_TEST_ACTION, OnButtonMakeTestAction)
    ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest)
    ON_CBN_SELCHANGE(IDC_COMBO_HI_FAMILY_LIST, OnSelchangeComboHiFamilyList)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


разворачивается препроцессором в

const AFX_MSGMAP* CTestDlg::GetMessageMap() const { return &CTestDlg::messageMap; }

const AFX_MSGMAP CTestDlg::messageMap = 
{ &CDialog::messageMap, &CTestDlg::_messageEntries[0] };

const AFX_MSGMAP_ENTRY CTestDlg::_messageEntries[] = {
    
    { 0x0111, (WORD)0, (WORD)1001, (WORD)1001, AfxSig_vv, (AFX_PMSG)&OnButtonMakeInstance },
    { 0x0111, (WORD)0, (WORD)1020, (WORD)1020, AfxSig_vv, (AFX_PMSG)&OnButtonMakeTestAction },
    { 0x0111, (WORD)0, (WORD)1023, (WORD)1023, AfxSig_vv, (AFX_PMSG)&OnButtonTest },
    { 0x0111, (WORD)1, (WORD)1002, (WORD)1002, AfxSig_vv, (AFX_PMSG)&OnSelchangeComboHiFamilyList },
    
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } };


Файл ресурсов, Resource.h корректны.
Т.е. на мой взгляд нечастого пользователя MFC, карта сообщений корректна.

Теперь что я вижу в дебагере.
_messageEntries[0] выглядит вполне нормально и именно этот обработчик вызывается без проблем.
_messageEntries[1] уже явно порушен и выглядит так:
_messageEntries[1].nMessage == 0
_messageEntries[1].nCode == 0
_messageEntries[1].nID == 0
_messageEntries[1].nLastID == 273
_messageEntries[1].nSig == 0
_messageEntries[1].pfn == 0x000003fc


Т.е. я конечно могу начать копать глубже и могу посмотреть
как инициализируется _messageEntries на уровне команд ассемблера,
но какой в этом смысл?

Так что проблема скорей всего связана именно особенностями eVC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.