Привет Всем!
Такая задача — головоломка!?
В класс визарде добавил ивент на мой диалог — WM_KEYDOWN, сгенерировался код:
void CGridPojectDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
MessageBox("str"); /*Добавил Я*/ :)
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
Ну и что спросите вы, а то что не при каких нажатиях клавиш не появляетса эта мессага!
Уже кровь из ушей пошла ну не как не доганяю в чем дело, помагите а? Буду очень блогадарень.
И еше не отсилать на поиск, не работает, искал в гоогле по моему этого не у кого не было!?
П.С. Клава у меня работает нормално, доказателство этот пост!
F>Ну и что спросите вы, а то что не при каких нажатиях клавиш не появляетса эта мессага!
F>Уже кровь из ушей пошла ну не как не доганяю в чем дело, помагите а? Буду очень блогадарень.
F>И еше не отсилать на поиск, не работает, искал в гоогле по моему этого не у кого не было!?
F>П.С. Клава у меня работает нормално, доказателство этот пост!
у тебя на диалоге скорее всего есть какие то контролы, например табличка (listctrl) в котором ты и нажимаешь кнопки, а обработчик сообщения у тебя встроен в диалог, который не получает это сообщение когда нажимаешь кнопки в лист контроле а не в диалоге.
попробуй создать свой класс list controla, унаследованный от того что у тебя есть и туда прописать этот обработчик.
Исправлено форматирование текста. Удалено избыточное цитирование. — SchweinDeBurg
Здравствуйте, Sashaka, Вы писали:
S>попробуй создать свой класс list controla, унаследованный от того что у тебя есть и туда прописать этот обработчик.
Да выше верно сказанно, что у вас наверняка есть какойто елемент управления, которому и приходитя сообщения(так как на контрое установлен фокус ввода). Выходов из это ситуации много:
унаследовать класс(сказанно выше), но что если у вас там два десятка едитов, и фокус то у одного то у другого(е если диалог обширный, и элементы разные)... если же у вас только один елемент управления(к примеру listctr), то чтобы не наследовать новый класс, были придуманы нотифай сообщения, которые уведомляют родителя о событиях происходящих на дочерних елементах управления. Конкретно для листкантрола это:
BEGIN_MESSAGE_MAP(CSomeDlg, CDialog)
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnLvnKeydownList1)
END_MESSAGE_MAP()
void CSomeDlg::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
*pResult = 0;
}
Как универсальный вариант, можно переопределить виртуальную функцию PreTranslateMessage у вашего диалога,она вызывается по родительской цепочьке(клас приложения/главное окно/.../родитель елемента управления/сам елемент управления), и в ней можно перехватить любое сообщение, до того как оно дойдет до адресата(елемента управления на котором установлен фокус)
BOOL CSomeDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
MessageBox("WM_KEYDOWN");
}
return CDialog::PreTranslateMessage(pMsg);
}
прошу прощения за очипятки... пора менят клавиатуру...
надеюсь помог...
Удачки.
Удалено избыточное цитирование. — SchweinDeBurg
Здравствуйте, 0000xF, Вы писали:
F>Ну и что спросите вы, а то что не при каких нажатиях клавиш не появляетса эта мессага!
А в карте сообщений BEGIN_MESSAGE_MAP(CGridPojectDlg, CDialog)
прописан макрос примерно такого вида ON_WM_KEYDOWN()