Knowledge Base |

# How To Trap Arrow Keys in an Edit Control of a Dialog Box

Article ID: 104637

Article Last Modified on 11/21/2006

APPLIES TO

- Microsoft Foundation Class Library 4.2, when used with:
  - Microsoft Visual C++ 1.0 Professional Edition
  - Microsoft Visual C++ 1.5 Professional Edition
  - Microsoft Visual C++ 1.51
  - Microsoft Visual C++ 1.52 Professional Edition
  - Microsoft Visual C++ 1.0 Professional Edition
  - Microsoft Visual C++ 2.0 Professional Edition
  - Microsoft Visual C++ 2.1
  - Microsoft Visual C++ 4.0 Standard Edition

This article was previously published under Q104637

## SUMMARY

This article describes how to trap arrow keys in an edit control of a dialog box with the Microsoft Foundation Classes (MFC) versions 2.0 and above. Although the example in this article uses an edit control, a similar mechanism applies to other controls as well.

## MORE INFORMATION

To trap the arrow keys in an edit control of a dialog box, the following steps may be taken:

1. Create a dialog box class derived from CDialog. For example, you can create a dialog box class called CMyDlg:public CDialog with Class Wizard.
2. Create your own edit class and trap WM_GETDLGCODE and WM_KEYDOWN. The code will resemble the following:

             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)
            {
                  //Check if the key pressed was a DOWN ARROW key
                  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);
             }

   NOTE: if Class Wizard is used to add a CMyEdit class, you must derive the class from CWnd first and then manually change any references of CWnd to CEdit in the code. It is important to trap WM_GEDLGCODE in your own edit class and specify DLGC_WANTARROWS in OnGetDlgCode().
3. Create a member variable that maps to your own edit class in the dialog box class and override CWnd::DoDataExchange(). Your code should resemble the following:

             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);
             }

   NOTE: This can be done easily by Class Wizard. For example, you can add a member variable m_edit and map it to CEdit and then manually change CEdit references in MyEdit.CPP and MyEdit.H files to CMyEdit.

Additional query words: kbinf 1.00 1.50 1.51 1.52 2.00 2.10 2.50 2.51 3.00 3.10 4.00

Keywords: kbhowto kbuidesign kbctrl KB104637