Изменить символ, вставленный с помощью 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 отображал ‘°’ или другой символ, который я указал.

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

1

Решение

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

Вы должны использовать другую последовательность, такую ​​как 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'+';
}
...
0

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

Мне нужно было получить позицию курсора, отправить строку добавления в элемент управления, а затем установить выбор после вставленного символа. Когда это происходит, я должен пропустить 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);
}
0