Article: Q104637
Product(s): Microsoft C Compiler
Version(s): winnt:1.0,2.0,2.1,4.0
Operating System(s):
Keyword(s): kbCtrl kbMFC KbUIDesign kbVC kbGrpDSMFCATL
Last Modified: 07-MAY-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), used with:
- Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52
- Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 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 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 : kbCtrl kbMFC KbUIDesign kbVC kbGrpDSMFCATL
Technology : kbAudDeveloper kbMFC
Version : winnt:1.0,2.0,2.1,4.0
Issue type : kbhowto
=============================================================================