在C ++中为CreateWindow宏添加负值

时间:2018-10-26 07:04:48

标签: c++ windows

我使用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

在编辑控件中,是否可以仅支持负值内的整数? 有人可以帮我吗?

1 个答案:

答案 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()函数。