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:
- Create a dialog box class derived from CDialog. For example, you can create a dialog box class called CMyDlg:public CDialog with Class Wizard.
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().
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