Как перехватить клавиши со стрелками в Edit
диалогового окна
Для этого проделаем следующие шаги:
Наследуем диалоговый класс от CDialog. Например,
можно создать диалоговый класс CMyDlg:public CDialog при
помощи визарда.
Создаём собственный edit класс и перехватываем
WM_GETDLGCODE и WM_KEYDOWN. Код будет выглядеть следующим
образом:
class CMyEdit : public CEdit
{
// Construction
public:
CMyEdit();
public:
virtual ~CMyEdit();
protected:
afx_msg UINT OnGetDlgCode();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
DECLARE_MESSAGE_MAP()
};
CMyEdit::CMyEdit()
{
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_GETDLGCODE()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
UINT CMyEdit::OnGetDlgCode()
{
return DLGC_WANTARROWS|DLGC_WANTALLKEYS|DLGC_WANTCHARS;
}
void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//Проверяем, если нажатая клавиша была СТРЕЛКА ВНИЗ
if (nChar == VK_DOWN)
AfxMessageBox("It is a down arrow key!");
if (nChar == VK_RIGHT)
AfxMessageBox("It is a right arrow key!");
if (nChar == VK_LEFT)
AfxMessageBox("It is a left arrow key!");
if (nChar == VK_UP)
AfxMessageBox("It is a up arrow key!");
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
ЗАМЕЧАНИЕ: если для добавления класса CMyEdit
использовался визард, то сначала этот класс надо
наследовать от CWnd, а затем вручную изменить
родителя с CWnd на CEdit. Это важно для перехвата
WM_GEDLGCODE в Вашем собственно edit классе, а также
указать DLGC_WANTARROWS в OnGetDlgCode().
В диалоговом классе создаём переменную-член,
которая авляется экземпляром Вашего edit класса и
переопределяем CWnd::DoDataExchange(). Код будет выглядеть
следующим образом:
Обратите внимание: Это можно просто сделать
при помощи визарда. Например, можно добавить
переменную m_edit и связать её с CEdit а затем вручную
изменить CEdit в файлах MyEdit.CPP и MyEdit.H на CMyEdit.