Изменить символ, вставленный с помощью Alt+Unicode в CRichEdit

Я хочу изменить символ Unicode, вставленный с помощью Alt+ код Unicode с клавиатуры. Я использовал PretranslateMessage для изменения символов, вставленных прямо с клавиатуры, и это работало. Но с методом кода Alt+ Unicode это не так. Вот код: Microsoft Word имеет эту функцию при включении показать / скрыть метки абзаца.

BOOL CEmphasizeEdit::PreTranslateMessage(MSG* msg)
{
    if (msg->hwnd == m_hWnd)
    {
        if (msg->message == WM_CHAR)
        {
            if (TheApp.Options.m_bShowWSpaceChars)
            {
                if (msg->wParam == ' ')  // This works in both cases Space key pressed or Alt + 3 + 2 in inserted
                {
                    msg->wParam = '·';
                }
                else if (msg->wParam == (unsigned char)' ') // this does not work
                {
                    msg->wParam = (unsigned char)'°'; 
                }
            }
        }
    }
    return CRichEditCtrl::PreTranslateMessage(msg);
}

Если я вставлю с клавиатуры Alt + 0 + 1 + 6 + 0, что означает ' '(пробел без перерывов), я хочу, чтобы CRichEditCtrl отображал '°' или другой символ, который я указал.

Как я могу справиться с этим, чтобы заставить его работать?

2 ответа

Решение

Мне пришлось получить позицию курсора, отправить строку добавления в элемент управления, а затем установить выбор после вставленного символа. Когда это происходит, я должен пропустить CRichEditCtrl::PreTranslateMessage(msg);

BOOL CEmphasizeEdit::PreTranslateMessage(MSG* msg)
{
    if (msg->hwnd == m_hWnd)
    {
        if (msg->message == WM_CHAR)
        {
            TCHAR text[2];
            text[1] = 0x00;
            BOOL found = 1;

            switch (msg->wParam)
            {
                case 0x20: text[0] = _C('·'); break;
                case 0xA0: text[0] = 0xB0; break;
            }

            CHARRANGE cr;
            GetSel(cr);
            cr.cpMax++;
            cr.cpMin++;

            ReplaceSel(text);
            SetSel(cr);

            return 1;
        }
    }
    return CRichEditCtrl::PreTranslateMessage(msg);
}

Alt+Space зарезервировано для закрытия меню программы.

Вы должны использовать другую последовательность, такую ​​как Ctrl+Пробел или Alt+Ctrl+Пробел

' ' а также (unsigned char)' ' это то же самое, поэтому код никогда не достигает else if (msg->wParam == (unsigned char)' '), Вы должны удалить это.

использование GetAsyncKeyState увидеть, если Alt или же Ctrl клавиша нажата.

BOOL IsKeyDown(int vkCode)
{
    return GetAsyncKeyState(vkCode) & 0x8000;
}

...
if (msg->wParam == ' ')
{
    if (IsKeyDown(VK_CONTROL))
        msg->wParam = L'°'; 
    else
        msg->wParam = L'+';
}
...
Другие вопросы по тегам