Добавить отрицательные значения для макроса createwindow в c++

Я создал текстовое поле с помощью CreateWindow API в программировании графического интерфейса Windows следующим образом:

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.

Есть ли способ поддерживать только целые числа в отрицательных значениях в поле редактирования? Может ли кто-нибудь помочь мне в этом?

Посмотрите, полезен ли этот документация.

Recker 26.10.2018 09:08

Согласно приведенной выше документации, мы можем добавлять цифры только при использовании ES_NUMBER. Есть ли способ добавить поддержку отрицательных значений?

Namodaya Balaarachchi 26.10.2018 09:11
To translate text that was entered into the edit control to an integer value, use the GetDlgItemInt function. Документация функции GetDlgItemInt заявляет, что вам необходимо установить флаг bSigned, который Indicates whether the function should examine the text for a minus sign at the beginning and return a signed integer value if it finds one
Recker 26.10.2018 09:17

Это упрощенный вариант стиля, который фильтрует вводимые символы. Разрешены только цифры, без «-». Не используйте это.

Hans Passant 26.10.2018 16:21
2
4
265
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Стиль 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, если вы компилируете свой проект с включенным Unicode или char еще. Вы можете напрямую использовать char или wchar_t.

Строковый литерал ACCEPTED_CHARS содержит все допустимые символы. Для более длинного списка вы можете использовать isdigit (), ischar () и т. д. Вместо функции _tcsstr ().

Он по-прежнему имеет ту же проблему, что и ES_NUMBER, вы можете копировать / вставлять все, что хотите.

Hans Passant 26.10.2018 16:24

В этом случае символ Backspace игнорируется. Также копирование / вставка не работает.

Namodaya Balaarachchi 29.10.2018 20:26

Другие вопросы по теме