在 CRichEdit 中使用 Alt+Unicode 更改插入的字符
Change char inserted using Alt+Unicode in CRichEdit
我想更改使用键盘上的 Alt+Unicode 代码插入的 Unicode 字符。
我使用 PretranslateMessage 来更改直接从键盘插入的字符并且它起作用了。但使用 Alt+Unicode 代码方法则不然。
这是代码:
Microsoft Word 在启用 show/hide 段落标记时具有此功能。
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 插入 ' '(No-Break Space),我希望 CRichEditCtrl 显示 '°' 或我指定的另一个字符.
我该如何处理才能使其发挥作用?
Alt+Space 保留给程序的关闭菜单。
您应该使用其他序列,例如 Ctrl+Space 或 Alt +Ctrl+Space
' '
和 (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'+';
}
...
我必须获取光标位置,向控件发送附加字符串,然后在插入的字符后设置选择。发生这种情况时,我必须跳过 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+Unicode 代码插入的 Unicode 字符。 我使用 PretranslateMessage 来更改直接从键盘插入的字符并且它起作用了。但使用 Alt+Unicode 代码方法则不然。 这是代码: Microsoft Word 在启用 show/hide 段落标记时具有此功能。
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 插入 ' '(No-Break Space),我希望 CRichEditCtrl 显示 '°' 或我指定的另一个字符.
我该如何处理才能使其发挥作用?
Alt+Space 保留给程序的关闭菜单。
您应该使用其他序列,例如 Ctrl+Space 或 Alt +Ctrl+Space
' '
和 (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'+';
}
...
我必须获取光标位置,向控件发送附加字符串,然后在插入的字符后设置选择。发生这种情况时,我必须跳过 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);
}