Стиль ES_NUMBER лучше называть ES_DIGITSONLY. В качестве ввода с клавиатуры принимаются только цифры.
Если вы хотите использовать элемент управления редактированием Windows, принимающий цифры и знаки, вы должны создать его подкласс.
Это означает, что вы заменяете стандартную оконную процедуру вашего элемента управления редактированием своей собственной оконной процедурой. Ваша оконная процедура реализует новые функции элемента управления для редактирования, все остальное передается оконной процедуре по умолчанию для элемента управления для редактирования (не DefWindowProc ()!).
Вот пример в старом стиле C (потому что вы использовали Win32 API):
WNDPROC PreviousEditProc;
LRESULT CALLBACK EditSubclassProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) {
const TCHAR* ACCEPTED_CHARS = TEXT("0123456789+-");
TCHAR c;
switch( uMessage ) {
case WM_CHAR:
c = (TCHAR) wParam;
if( _tcschr( ACCEPTED_CHARS, c ) == nullptr )
return( 0 );
break;
}
return( CallWindowProc( PreviousEditProc, hWnd, uMessage, wParam, lParam ) );
}
Подкласс управления редактированием, вы должны перейти к оконной процедуре и сохранить предыдущую процедуру:
HWND hEdit;
hEdit = CreateWindow( TEXT("EDIT"),
TEXT(""),
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_DLGFRAME | ES_RIGHT,
x, y, w, h,
hwnd_,
(HMENU)0,
GetWindowInstance( hwnd_ ),
0 );
PreviousEditProc = (WNDPROC) SetWindowLong( hEdit, GWL_WNDPROC, (LPARAM) EditSubclassProc );
Примечания:
Вы можете создавать подклассы нескольких элементов управления для редактирования, используя приведенный выше код, но вы не можете дважды создать подкласс для элемента управления для редактирования с помощью одной и той же процедуры подкласса (PreviousEditProc будет перезаписан сам по себе).
Тип TCHAR - это wchar_t, если вы компилируете свой проект с включенным Юникодом или
Чарс еще. Вы можете использовать char или wchar_t напрямую.
Строковый литерал ACCEPTED_CHARS содержит все допустимые символы. Для более длинного списка вы можете использовать isdigit (), ischar () и т. Д. Вместо функции _tcsstr ().