我有WM_KEYDOWN消息中的pMsg->wParam
,我想将其转换为CString
。我怎么能这样做?
我尝试过以下代码:
TCHAR ch[2];
ch[0] = pMsg->wParam;
ch[1] = _T('\0');
CString ss(ch);
但它不适用于高位ASCII字符。
答案 0 :(得分:2)
问题是wParam
包含一个字符数组的指针。它不是单个字符,因此您无法通过将其分配给ch[0]
来自行创建字符串,因为您正在尝试此处。
解决方案比您预期的要容易得多。 CString
类有一个构造函数,它接受一个指向字符数组的指针,这正是你在wParam
中所拥有的。
(实际上,它有a bunch of constructors,几乎所有你需要的东西......)
所以你要做的就是:
CString ss(pMsg->wParam);
构造函数将处理其余部分,将wParam
指向的字符串复制到ss
类型。
答案 1 :(得分:2)
根据documentation,WM_CHAR
会在wParam
中发送字符代码。备注部分的第一段说明代码确实是Unicode UTF-16代码点。无论您是编译8位还是16位TCHAR
的代码,都是如此。
CodyGray的评论在CString
提供各种构造函数的部分是正确的。您正在寻找的是一个wchar_t
作为其第一个参数(第二个参数,重复计数,默认设置为1)。因此,要构建CString
中的WPARAM
,请将值转换为wchar_t
。下面的示例打印“0”,确认构造的字符串确实是预期的字符串。
#include <stdio.h>
#include <Windows.h>
#include <cstringt.h>
#include <atlstr.h>
int main ()
{
WPARAM w = 0x222D;
CString cs ((wchar_t)w);
printf ("%d", cs.Compare (L"\x222D"));
}
它在_UNICODE和ANSI编译模式下的工作方式相同,并且可以在32位和64位上移植。