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

.
Полный ребилд не помогает...
В чем тут может быть проблема
12.09.03 18:44: Перенесено модератором из 'MFC' — AS
Здравствуйте, bkat.
Ты бы все-таки ручками посмотрел карту сообщений... Если обработчики не вызываются,
значит — нету их. Проверить стоит однако.
Здравствуйте, 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.
Так что все на месте
Здравствуйте, 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++ вам поможет это определить.
Здравствуйте, bkat.
Дык я и не сомневаюсь, что в исходном коде все есть. Я имел ввиду карту
сообщений в процессе исполнения приложения. Макросы ON_MESSAGE и иже с ними
разворачиваются в определенную структуру. Вот её-то я и рекомендовал посмотреть.
Сравнить адреса в карте и адреса обработчиков.
Кстати, по поводу маршрутизации сообщений в MFC на RSDN была статья. Поищи.
Спасибо за отклик, но прошу обратить внимание,
что я спрашиваю про 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