繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM