Как перехватить клавиши со стрелками в Edit диалогового окна

Для этого проделаем следующие шаги:

  1. Наследуем диалоговый класс от CDialog. Например, можно создать диалоговый класс CMyDlg:public CDialog при помощи визарда.

  2. Создаём собственный 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().

  3. В диалоговом классе создаём переменную-член, которая авляется экземпляром Вашего 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.