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

Last reviewed: October 10, 1997
Article ID: Q104637
1.00 1.50 1.51 1.52 | 1.00 2.00 2.10 4.00
WINDOWS             | WINDOWS NT
kbprg

The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), included with:

        - Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51. and
          1.52
        - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, and
          4.0
    

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 reference words: kbinf 1.00 1.50 1.51 1.52 2.00 2.10 2.50 2.51
3.00 3.10 4.00
KBCategory: kbprg
KBSubcategory: MfcUI
Keywords : MfcUI kbprg
Technology : kbMfc
Version : 1.00 1.50 1.51 1.52 | 1.00 2.00
Platform : NT WINDOWS


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: October 10, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.