Re[2]: OnKeyDown ?
От: AlexLinch Украина  
Дата: 17.07.07 11:32
Оценка:
Исправлено форматирование текста. Удалено избыточное цитирование. — 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.