Как перехватить клавиши со стрелками в Edit диалогового окна
|
Для этого проделаем следующие шаги: - Наследуем диалоговый класс от CDialog. Например, можно создать диалоговый класс CMyDlg:public CDialog при помощи визарда.
- Создаём собственный edit класс и перехватываем WM_GETDLGCODE и WM_KEYDOWN. Код будет выглядеть следующим образом:
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) { //Проверяем, если нажатая клавиша была СТРЕЛКА ВНИЗ 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); } ЗАМЕЧАНИЕ: если для добавления класса CMyEdit использовался визард, то сначала этот класс надо наследовать от CWnd, а затем вручную изменить родителя с CWnd на CEdit. Это важно для перехвата WM_GEDLGCODE в Вашем собственно edit классе, а также указать DLGC_WANTARROWS в OnGetDlgCode().
- В диалоговом классе создаём переменную-член, которая авляется экземпляром Вашего edit класса и переопределяем CWnd::DoDataExchange(). Код будет выглядеть следующим образом:
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); } Обратите внимание: Это можно просто сделать при помощи визарда. Например, можно добавить переменную m_edit и связать её с CEdit а затем вручную изменить CEdit в файлах MyEdit.CPP и MyEdit.H на CMyEdit. |