Member 13089825 Ответов: 2

Прием только от А до Я и от А до Я (только альпабатические символы)


Как реализовать доступ только к буквенным символам в vc++ mfc

Что я уже пробовал:

BOOL CFilterGroup:: PreTranslateMessage(MSG* pMsg)
{
if (pMsg - & gt;message == WM_CHAR)
{
если ((pMsg-&ГТ;параметр wparam &ГТ;= '\x41' &&усилителя; pMsg-&ГТ;параметр wparam &ЛТ;= '\x5A'))
{

возвращать false;
}
}
return CDialogEx:: PreTranslateMessage(pMsg);
}

но его не игнорируют, а берут все персонажи

2 Ответов

Рейтинг:
5

Richard MacCutchan

Ваш тест выглядит неправильно; конечно, он должен вернуться TRUE для обозначения буквенного символа. Кроме того, зачем использовать шестнадцатеричные, а не реальные символы? Так...

if ((pMsg->wParam >= 'A' && pMsg->wParam <= 'Z') ||
    (pMsg->wParam >= 'a' && pMsg->wParam <= 'z'))
{
    return TRUE;
}

Вы можете увидеть, что такое фактическое значение wParam с помощью вашего отладчика.


Рейтинг:
13

Jochen Arndt

Вы должны отменить проверку и возвращаемое значение.

Видеть CWnd:: PreTranslateMessage[^]:

Цитата:
Ненулевое значение, если сообщение было переведено и не должно быть отправлено; 0, если сообщение не было переведено и не должно быть отправлено.
Ты должен вернуться TRUE если сообщение должно быть отфильтровано.

Чтобы проверить наличие строчных и прописных букв ASCII (a-z, A-Z), вы можете использовать isalpha[^]
#include <ctype.h>

BOOL CFilterGroup::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_CHAR)
    {
        if (!isalpha(pMsg->wParam))
        {
            /* Return TRUE to indicate that message should not be dispatched. */
            return TRUE;
        }
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}