Winapi — Win32 API: как заставить Edit Text принимать беззнаковые плавающие только в c ++?

Я пытаюсь научиться Win32 API 🙂

У меня есть текст для редактирования, помещенный в DialogBox, и я хочу, чтобы он принимал только числа с плавающей точкой, которые больше 0

Мне удалось сделать этот редактируемый текст для приема целых чисел только с помощью стиля «ES_NUMBER» в файле ресурсов, но я не могу найти способ заставить его принимать положительные значения с плавающей точкой
пожалуйста, мне нужна ваша помощь спасибо

5

Решение

В дополнение к обработке EN_CHANGE Уведомление у вас также есть возможность подклассов окно. Это позволит вам ограничить, какие нажатия клавиш действительны, и разрешить только цифры, точки и т. Д. В приведенном ниже примере показано, как создать элемент управления редактирования, создать его подкласс и отфильтровать входные данные, чтобы разрешались только определенные символы. Он не обрабатывает такие операции, как вставка из буфера обмена, поэтому вы захотите расширить его в соответствии с вашими конкретными требованиями.

Преимущества этого подхода состоят в том, что вам не нужно добавлять дополнительный код в родительское окно для фильтрации элемента управления редактирования. Это позволяет использовать его во всем приложении без необходимости дублирования большого количества кода. Еще одним преимуществом является устранение возможного мерцания, возникающего при обновлении содержимого элемента управления для удаления нежелательных символов.

static WNDPROC OriginalEditCtrlProc = NULL;

LRESULT CALLBACK MyWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
if(uMsg == WM_CHAR)
{
// Make sure we only allow specific characters
if(!    ((wParam >= '0' && wParam <= '9')
|| wParam == '.'
|| wParam == VK_RETURN
|| wParam == VK_DELETE
|| wParam == VK_BACK))
{
return 0;
}
}

return CallWindowProc(OriginalEditCtrlProc, hwnd, uMsg, wParam, lParam);
}

void CreateCustomEdit(HINSTANCE hInstance, HWND hParent, UINT id)
{
HWND hwnd;

hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
_T("EDIT"),
_T(""),
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
0, 0, 200, 40,
hParent,
reinterpret_cast<HMENU>(id),
hInstance,
NULL);
if(hwnd != NULL)
{
// Subclass the window so we can filter keystrokes
WNDPROC oldProc = reinterpret_cast<WNDPROC>(SetWindowLongPtr(
hwnd,
GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(MyWindowProc)));
if(OriginalEditCtrlProc == NULL)
{
OriginalEditCtrlProc = oldProc;
}
}
}
4

Другие решения

Используйте уведомления EN_UPDATE, и если пользователь вводит знак минуса, просто удалите его. Чистый эффект будет именно тем, что вы хотите: элемент управления, который принимает только положительные числа с плавающей точкой. Не используйте EN_CHANGE, поскольку он отправляется после перерисовки элемента управления, а для изменения ввода потребуется еще одна перерисовка, которая создаст впечатление мерцания элемента управления.

3

В C ++ нет неподписанного числа с плавающей точкой, так что это невозможно!

Вам, вероятно, придется подтвердить явно.

2