// 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)
{
...
}
Как узнать, какой символ был только что введен в окно CEdit?
На диалоговом окне есть EditBox. При каждом нажатии клавиш в него вводится какой-то символ (а при вставке из буфера - сразу несколько). Как узнать, что только что было введено?
Цитата:
Originally posted by Doomych
На диалоговом окне есть EditBox. При каждом нажатии клавиш в него вводится какой-то символ (а при вставке из буфера - сразу несколько). Как узнать, что только что было введено?
На диалоговом окне есть EditBox. При каждом нажатии клавиш в него вводится какой-то символ (а при вставке из буфера - сразу несколько). Как узнать, что только что было введено?
Обрабатывай WM_KEYDOWN, WM_PASTE
Цитата:
Originally posted by Green
Обрабатывай WM_KEYDOWN, WM_PASTE
Обрабатывай WM_KEYDOWN, WM_PASTE
Только вместо WM_KEYDOWN лучше WM_CHAR обрабатывать, т.к. если клавишу зажать, то WM_KEYDOWN один раз сработает, а символов введётся уж побольше одного.
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
Цитата:
Originally posted by Doomych
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
Вообще надо переопределить процедуру окна через SetWindowLong, написать свою, и в ней обрабатывать. На wasm.ru в туториалах Iczelion'а есть глава про сабклассинг окон, там подробно можно прочитать.
Цитата:
Originally posted by Doomych
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
А как без ClassWizard'а в EditBox'е перехватить сообщения WM_KEYDOWN или WM_CHAR? По крайней мере, эти сообщения можно обработать в классе диалога, но там они не перехватываются вообще!
Используешь MFC или WTL?
В любом случае наследуй класс от CEdit, вставляй в него карту сообщений.
Для MFC примерно так:
Код:
Код:
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;
}
};
{
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;
}
};
А как из виртуального кода клавиши получить сам символ: ведь может быть включена та или иная раскладка клавиатуры, нажат Shift или NumLock и т.д.
И вообще: как пользоваться параметром nFlags функции OnKeyDown?
BOOL PreTranslateMessage(MSG* pMsg)
и в структурке pMsg - о сообщении. Напр.
pMsg->message == WM_KEYDOWN // нажата какая-то клавиша.
pMsg->wParam // а в wParam - какая именно.
если не ошибаюсь то в lParam - сведения о комбинации клавиш.
Не забудь о WM_PASTE.
Кстати, шороший способ убивать нежелательный Enter и Esc.