我使用Windows GUI编程中的 CreateWindow API创建了文本框,如下所示,
CreateWindow( TEXT("EDIT"),
TEXT(""),
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_DLGFRAME | ES_RIGHT,
x, y, w, h,
hwnd_,
(HMENU)0,
GetWindowInstance( hwnd_ ),
0 );
当我使用 ES_NUMBER 编辑控件样式时,只允许将数字放入编辑控件中。但是我不能将负值设置为 -123 。
在编辑控件中,是否可以仅支持负值内的整数? 有人可以帮我吗?
答案 0 :(得分:3)
最好将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自身将被覆盖)。
如果您在启用Unicode的情况下编译项目,则TCHAR类型为wchar_t或 其他字符。您可能要直接使用char或wchar_t。
字符串文字ACCEPTED_CHARS包含所有接受的字符。对于更长的列表,可以使用isdigit(),ischar()等代替_tcsstr()函数。