WNDPROC oldeditproc;
...
LRESULT CALLBACK NewEditWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_KEYDOWN && wParam == VK_RETURN)
{
// вызвать нужную функцию тут
// или можно послать WM_COMMAND родительскому окну
return 0;
}
return CallWindowProc(oldeditproc, hWnd, message, wParam, lParam);
}
...
OldWndProc = (WNDPROC)SetWindowLongPtr(hEditWnd, GWLP_WNDPROC, (LONG_PTR)NewEditWndProc);
EditBox и кнопка Enter
Ребят, как сделать, чтобы если EditBox находится в фокусе (то есть в него осущеуствляется ввод с клавиатуры текста), при нажатии на Enter, выполнялась некая функци func() вместо перехода на след строчку?
Если речь идет не об обычном окне, а о диалоге, будет срабатывать нажатие на Default button, т. е. вызывается обработчик кнопки, которая в диалоге прописана как Default button. Если, конечно, речь идет об однострочном Edit'е.
Цитата: cheburator
Если речь идет не об обычном окне, а о диалоге, будет срабатывать нажатие на Default button, т. е. вызывается обработчик кнопки, которая в диалоге прописана как Default button. Если, конечно, речь идет об однострочном Edit'е.
Нет, в editbox осуществляется ввод данных, то есть при нажатии Enter просто ввод перейдёт на следующую строчку. Default button не нажмётся никак...
В том то и вопрос =)
Замени WndProc на свою:
Цитата: VK77
Замени WndProc на свою:
hEditWnd - хэндл edit box окна
hEditWnd - хэндл edit box окна
Код:
WNDPROC oldeditproc;
...
LRESULT CALLBACK NewEditWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_KEYDOWN && wParam == VK_RETURN)
{
// вызвать нужную функцию тут
// или можно послать WM_COMMAND родительскому окну
return 0;
}
return CallWindowProc(oldeditproc, hWnd, message, wParam, lParam);
}
...
OldWndProc = (WNDPROC)SetWindowLongPtr(hEditWnd, GWLP_WNDPROC, (LONG_PTR)NewEditWndProc);
...
LRESULT CALLBACK NewEditWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_KEYDOWN && wParam == VK_RETURN)
{
// вызвать нужную функцию тут
// или можно послать WM_COMMAND родительскому окну
return 0;
}
return CallWindowProc(oldeditproc, hWnd, message, wParam, lParam);
}
...
OldWndProc = (WNDPROC)SetWindowLongPtr(hEditWnd, GWLP_WNDPROC, (LONG_PTR)NewEditWndProc);
У меня классовое приложение... MFC.
Делаю также, только:
Код:
oldeditproc = (WNDPROC)SetWindowLongPtr(GetDlgItem(IDC_EDIT2)->GetSafeHwnd(),GWLP_WNDPROC, (LONG_PTR)NewEditWndProc);
При компиляции получаю варнинги на эту функцию:
1.cpp(40) : warning C4244: 'argument' : conversion from 'LONG_PTR' to 'LONG', possible loss of data
1.cpp(40) : warning C4312: 'type cast' : conversion from 'LONG' to 'WNDPROC' of greater size
Ну и как следствие, при запуске программа падает на ней...
В чём может быть дело?
а средствами MFC обработать WM_KEYDOWN не судьба?
Цитата: craftyfox
а средствами MFC обработать WM_KEYDOWN не судьба?
Код:
void CDlg1::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_RETURN) {
MessageBoxA("A","A", 0);
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
{
if(nChar == VK_RETURN) {
MessageBoxA("A","A", 0);
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
Вот такое сделал. Ноль реакции при нажатии Enter...
Можно создать для него свой класс, наследующий CEdit,
можно как здесь объясняется:
http://msdn2.microsoft.com/en-us/library/f7yhsd2b(VS.80).aspx
возможно, удасться отловить WM_KEYDOWN в PreTranslateMessage,
возможно, даже диалога, или объекта Application
Код:
...
void CDlg1::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_RETURN) {
int status = MessageBox( "Нажат Enter", "Enter", MB_OKCANCEL | MB_ICONQUESTION );;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
...
void CDlg1::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_RETURN) {
int status = MessageBox( "Нажат Enter", "Enter", MB_OKCANCEL | MB_ICONQUESTION );;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
...