[英]Add negative values for CreateWindow macro in C++
我在Windows GUI Programming中使用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 。
有没有办法在编辑控件中仅支持负值内的整数? 任何人都可以帮助我吗?
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()函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.