Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать, какой символ был только что введен в окно CEdit?

321
08 августа 2003 года
Doomych
124 / / 20.01.2000
На диалоговом окне есть EditBox. При каждом нажатии клавиш в него вводится какой-то символ (а при вставке из буфера - сразу несколько). Как узнать, что только что было введено?
3
10 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
На диалоговом окне есть EditBox. При каждом нажатии клавиш в него вводится какой-то символ (а при вставке из буфера - сразу несколько). Как узнать, что только что было введено?



Обрабатывай WM_KEYDOWN, WM_PASTE

424
10 августа 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by Green


Обрабатывай WM_KEYDOWN, WM_PASTE



Только вместо WM_KEYDOWN лучше WM_CHAR обрабатывать, т.к. если клавишу зажать, то WM_KEYDOWN один раз сработает, а символов введётся уж побольше одного.

321
12 августа 2003 года
Doomych
124 / / 20.01.2000
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
424
12 августа 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by Doomych
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!



Вообще надо переопределить процедуру окна через SetWindowLong, написать свою, и в ней обрабатывать. На wasm.ru в туториалах Iczelion'а есть глава про сабклассинг окон, там подробно можно прочитать.

3
12 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!



Используешь MFC или WTL?
В любом случае наследуй класс от CEdit, вставляй в него карту сообщений.
Для MFC примерно так:

Код:
// CEditCodeID.h

class CEditCodeID : public CEdit
{
  // Construction
public:
  CEditCodeID(CProgDlg *parent);
  virtual ~CEditCodeID();
 
  // Generated message map functions
protected:
  void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
 
  DECLARE_MESSAGE_MAP()
};

==================================================
//CEditCodeID.cpp

BEGIN_MESSAGE_MAP(CEditCodeID, CEdit)
  ON_WM_KEYDOWN()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEditCodeID message handlers

void CEditCodeID::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  ...
}
3
12 августа 2003 года
Green
4.8K / / 20.01.2000
Для WTL

Код:
class CMyEdit : public CWindowImpl<CMyEdit,CEdit>
{
public:
    BEGIN_MSG_MAP(CMyEdit)
        MESSAGE_HANDLER(WM_KEYDOWN,OnKeyDown)
    END_MSG_MAP()

private:
    LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
      ...
      return S_OK;
    }
};
321
04 сентября 2003 года
Doomych
124 / / 20.01.2000
Хорошо, использую MFC.
А как из виртуального кода клавиши получить сам символ: ведь может быть включена та или иная раскладка клавиатуры, нажат Shift или NumLock и т.д.
И вообще: как пользоваться параметром nFlags функции OnKeyDown?
2.2K
04 сентября 2003 года
Alex_Odessa
30 / / 12.05.2003
Я бы в отнаследованном от СEdit классе переопредилил
BOOL PreTranslateMessage(MSG* pMsg)

и в структурке pMsg - о сообщении. Напр.
pMsg->message == WM_KEYDOWN // нажата какая-то клавиша.
pMsg->wParam // а в wParam - какая именно.
если не ошибаюсь то в lParam - сведения о комбинации клавиш.
Не забудь о WM_PASTE.
Кстати, шороший способ убивать нежелательный Enter и Esc.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог