Как перехватить клавиши со стрелками в 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(). Код будет выглядеть следующим образом:
class CMyDlg : public CDialog
{
public:
CMyEdit m_edit;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //DDX/DDV
DECLARE_MESSAGE_MAP()
};
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_edit);
}Обратите внимание: Это можно просто сделать при помощи визарда. Например, можно добавить переменную m_edit и связать её с CEdit а затем вручную изменить CEdit в файлах MyEdit.CPP и MyEdit.H на CMyEdit.