C 子类编辑控件而不破坏复制/粘贴
我想创建一个编辑控件,用户只能在其中键入浮点数,但我也希望能够在此编辑中复制/粘贴/剪切文本。因此,我使用以下窗口过程对编辑控件进行了子类化:C 子类编辑控件而不破坏复制/粘贴,c,winapi,virtual-keyboard,editcontrol,C,Winapi,Virtual Keyboard,Editcontrol,我想创建一个编辑控件,用户只能在其中键入浮点数,但我也希望能够在此编辑中复制/粘贴/剪切文本。因此,我使用以下窗口过程对编辑控件进行了子类化: LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData) { 开关(msg) { 案例WM_CHAR: //如果字符不是数字或点,则拒绝它。 如果(!(('0')符合MSDN上的文
LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData)
{
开关(msg)
{
案例WM_CHAR:
//如果字符不是数字或点,则拒绝它。
如果(!(('0')符合MSDN上的文档:
我们首先在模块1中看到的函数将笔划转换为字符。该函数检查向下键消息并将其转换为字符。对于生成的每个字符,TranslateMessage
函数将or消息放入窗口的消息队列。的wParam参数该消息包含UTF-16字符
某些CTRL键组合转换为ASCII控制字符。例如,CTRL+A转换为ASCII CTRL-A(SOH)字符(ASCII值0x01)。对于文本输入,通常应过滤掉控制字符。此外,避免使用来实现键盘快捷键。相反,请使用消息;或者更好,使用加速表。下一主题中介绍了加速表
因此,在应用程序的消息循环中将CTRL-C、CTRL-V和CTRL-X序列的WM_KEYDOWN
消息转换为WM_CHAR
消息,其中包含ASCII控制字符0x03(ASCIIETX
,aka^C
),0x16(ASCIISYN
,aka^V
)和0x18(ASCII可以
,也称为^X
)
WM\u CHAR
携带翻译后的字符代码,而不是,这就是为什么VK\u CANCEL
(0x03)、VK\u IME\u ON
(0x16)和VK\u FINAL
(0x18)让您感到困惑的原因。虚拟键代码不在WM\u CHAR
中使用。VK\u返回
和VK\u返回
(但不是VK\u DELETE
)过滤中的“工作”是因为根据文档,这些键被转换为ASCII控制字符:
当函数转换与字符键对应的虚拟键代码时,窗口过程接收字符消息。字符消息为、、和。典型的窗口过程忽略除WM\u CHAR
以外的所有字符消息TranslateMessage
函数生成WM\u CHAR
消息当用户按下以下任意键时:
- 任意字符键
- 退格
- 输入(回车)
- 电子稳定控制系统
- SHIFT+ENTER(换行)
- 标签
ENTER被转换为ASCII控制字符0x0D(ASCIICR
,也称为^M
),它与VK\u RETURN
的数值相同
退格转换为ASCII控制字符0x08(ASCIIBS
,又称^H
),它与VK\U BACK
的数值相同
请注意,删除键不在翻译键列表中,因此标准删除键不会生成WM_CHAR
消息,因为没有用于删除的ASCII控制字符(但是,DEL(.)数字键盘上的键可能会生成一个带有VK\u DELETE
的WM\u CHAR
消息。在这种情况下,lParam
的第24位将为1)
因此,DefWindowProc()
将这些用于剪贴板操作的特殊WM_CHAR
消息分别转换为WM_COPY
、WM_PASTE
和WM_CUT
消息。但是,您正在过滤掉这些消息,以便它们不会到达defsublassproc()
,因此无法到达DefWindowProc()
因此,正如您已经发现的,您确实需要允许这些消息通过您的筛选,例如:
LRESULT回调FloatTextboxWindowProc(HWND windowHandle、UINT msg、WPARAM WPARAM、LPARAM LPARAM、UINT_PTR子类、DWORD_PTR refData)
{
if(msg==WM_CHAR)
{
//如果字符不是数字或点,则拒绝它。
如果((
(wparam>='0'&&wparam根据MSDN上的文档:
我们首先在模块1中看到的函数将笔划转换为字符。该函数检查向下键消息并将其转换为字符。对于生成的每个字符,TranslateMessage
函数将or消息放入窗口的消息队列。的wParam参数该消息包含UTF-16字符
某些CTRL键组合转换为ASCII控制字符。例如,CTRL+A转换为ASCII CTRL-A(SOH)字符(ASCII值0x01)。对于文本输入,通常应过滤掉控制字符。此外,避免使用来实现键盘快捷键。相反,请使用消息;或者更好,使用加速表。下一主题中介绍了加速表
因此,在应用程序的消息循环中将CTRL-C、CTRL-V和CTRL-X序列的WM_KEYDOWN
消息转换为WM_CHAR
消息,其中包含ASCII控制字符0x03(ASCIIETX
,aka^C
),0x16(ASCIISYN
,aka^V
)和0x18(ASCII可以
,也称为^X
)
WM_CHAR
携带翻译后的字符代码,而不是,这就是为什么VK_CANCEL
(0x03)、VK_IME_ON
(0x16)和VK_FINAL
(0x18)让您感到困惑的原因。虚拟键代码不在WM_CHAR
中使用。VK_RETURN
和