在 CRichEditCtrl MFC 中按下按键后替换字符
Replace character after key press in CRichEditCtrl MFC
我想重定向 Space 按键操作以显示另一个字符(空白字符 '·')。
我可以使用什么处理程序或 windows 消息来做到这一点?
一种方法是拦截PreTranslateMessage
中的key
BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
if (msg->hwnd == m_RichEdit.m_hWnd)
{
if (msg->message == WM_CHAR)
{
if (msg->wParam == ' ')
{
msg->wParam = '.';
return TRUE;
}
}
}
return CDialog::PreTranslateMessage(msg);
}
编辑:
要使用 Alt 键插入 unicode 字符:
声明会员资料:
int m_key_value;
初始化m_key_value = 0;
检查Alt键是否按下:
BOOL IsKeyDown(int vkCode)
{
return GetAsyncKeyState(vkCode) & 0x8000;
}
我们想看看在按下 Alt 键时是否按下了数字键。我们勾选WM_SYSKEYUP
(不要勾选WM_SYSKEYDOW
因为会导致重复字符)
BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
if (msg->hwnd == m_RichEdit.m_hWnd)
{
if (msg->message == WM_SYSKEYUP && IsKeyDown(VK_MENU))
{
int i = msg->wParam;
if (i >= '0' && i <= '9')
i -= '0';
else if (i >= VK_NUMPAD0 && i <= VK_NUMPAD9)
i -= VK_NUMPAD0;
if (i >= 0 && i <= 9)
{
m_key_value *= 10;
m_key_value += i;
TRACE("m_key_value = %d\n", m_key_value);
return TRUE;
}
}
if (msg->message == WM_KEYUP && msg->wParam == VK_MENU && m_key_value)
{
TRACE("WM_KEYUP RESULT %d\n", m_key_value);
if (m_key_value == 160) m_key_value = '.';
m_RichEdit.PostMessage(WM_CHAR, m_key_value, 0);
m_key_value = 0;
return TRUE;
}
}
return CDialog::PreTranslateMessage(msg);
}
我想重定向 Space 按键操作以显示另一个字符(空白字符 '·')。
我可以使用什么处理程序或 windows 消息来做到这一点?
一种方法是拦截PreTranslateMessage
BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
if (msg->hwnd == m_RichEdit.m_hWnd)
{
if (msg->message == WM_CHAR)
{
if (msg->wParam == ' ')
{
msg->wParam = '.';
return TRUE;
}
}
}
return CDialog::PreTranslateMessage(msg);
}
编辑: 要使用 Alt 键插入 unicode 字符:
声明会员资料:
int m_key_value;
初始化m_key_value = 0;
检查Alt键是否按下:
BOOL IsKeyDown(int vkCode)
{
return GetAsyncKeyState(vkCode) & 0x8000;
}
我们想看看在按下 Alt 键时是否按下了数字键。我们勾选WM_SYSKEYUP
(不要勾选WM_SYSKEYDOW
因为会导致重复字符)
BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
if (msg->hwnd == m_RichEdit.m_hWnd)
{
if (msg->message == WM_SYSKEYUP && IsKeyDown(VK_MENU))
{
int i = msg->wParam;
if (i >= '0' && i <= '9')
i -= '0';
else if (i >= VK_NUMPAD0 && i <= VK_NUMPAD9)
i -= VK_NUMPAD0;
if (i >= 0 && i <= 9)
{
m_key_value *= 10;
m_key_value += i;
TRACE("m_key_value = %d\n", m_key_value);
return TRUE;
}
}
if (msg->message == WM_KEYUP && msg->wParam == VK_MENU && m_key_value)
{
TRACE("WM_KEYUP RESULT %d\n", m_key_value);
if (m_key_value == 160) m_key_value = '.';
m_RichEdit.PostMessage(WM_CHAR, m_key_value, 0);
m_key_value = 0;
return TRUE;
}
}
return CDialog::PreTranslateMessage(msg);
}