我有一个ATL控件,我想要支持Unicode。我为WM_UNICHAR添加了一个消息处理程序:
MESSAGE_HANDLER( WM_UNICHAR, OnUniChar )
但是,由于某种原因,永远不会调用OnUniChar处理程序。
根据文档,应首先使用“UNICODE_NOCHAR”调用处理程序,如果要接收UTF-32字符,处理程序应返回TRUE。但是,正如我所说,处理程序永远不会被调用。
有什么特别需要做才能激活它吗?
答案 0 :(得分:5)
您认为应该生成WM_UNICHAR消息的是什么?
如果您的代码(或ATL代码)最终调用CreateWindowW,那么您的窗口已经识别出Unicode,并且WM_CHAR消息将是UTF-16格式。
关于什么时候确切地生成WM_UNICHAR消息,文档还远未明确,但是我可以通过非常有限的方式在Google网上论坛和互联网上收集它,看起来它是由第三方应用程序发送的,而不是Windows本身,除非Window是ANSI窗口(CreateWindowA和所有)。您是否尝试过手动向窗口发送WM_UNICHAR消息以查看会发生什么?如果您收到消息,那么您的消息调度代码没有任何问题,并且没有任何事情会导致WM_UNICHAR。你也可以查看Spy ++,看看你是否收到了这条消息,但我怀疑它没有被发送。
答案 1 :(得分:0)
我今天的经验是,Spy ++在Unicode proc中没有为WM_CHAR提供正确的结果。我正在获得ASCII翻译或'?'显示在消息列表中,即使我查看Raw(未解码)参数。调试器将wParam显示为Unicode代码点。
答案 2 :(得分:-1)
void CMFCProView::OnUniChar (UINT xChar, UINT nRepCnt, UINT nFlags)
void CMFCProView::OnChar (UINT xChar, UINT nRepCnt, UINT nFlags)
UINT(unsigned int)的范围是0到4294967295十进制(16位)。
OnChar可以做任何你想做的OnUniChar。点击英文
软键盘上的字符 A ,然后OnChar将收到0x0041
。
单击CJKV一(一),然后OnChar将收到0x4E00
。所以我们没有
在App中需要OnUniChar