15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как перехватить клавиши со стрелками в Edit диалогового окна

Для этого проделаем следующие шаги:

  1. Наследуем диалоговый класс от CDialog. Например, можно создать диалоговый класс CMyDlg:public CDialog при помощи визарда.

  2. Создаём собственный 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().

  3. В диалоговом классе создаём переменную-член, которая авляется экземпляром Вашего 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.