How To Trap Arrow Keys in an Edit Control of a Dialog Box (104637)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.0
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++ for Windows, 16-bit edition 1.51
    • Microsoft Visual C++ for Windows, 16-bit edition 1.52
    • Microsoft Visual C++, 32-bit Editions 1.0
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 2.1
    • Microsoft Visual C++, 32-bit Editions 4.0

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.

Modification Type:MinorLast Reviewed:7/13/2004
Keywords:kbCtrl kbhowto KbUIDesign KB104637