如何将wParam转换为CString?

时间:2012-02-16 06:49:26

标签: c++ winapi mfc cstring postmessage

我有WM_KEYDOWN消息中的pMsg->wParam,我想将其转换为CString。我怎么能这样做?

我尝试过以下代码:

TCHAR ch[2];
ch[0] = pMsg->wParam;
ch[1] = _T('\0');
CString ss(ch);

但它不适用于高位ASCII字符。

2 个答案:

答案 0 :(得分:2)

问题是wParam包含一个字符数组的指针。它不是单个字符,因此您无法通过将其分配给ch[0]来自行创建字符串,因为您正在尝试此处。

解决方案比您预期的要容易得多。 CString类有一个构造函数,它接受一个指向字符数组的指针,这正是你在wParam中所拥有的。
(实际上,它有a bunch of constructors,几乎所有你需要的东西......)

所以你要做的就是:

CString ss(pMsg->wParam);

构造函数将处理其余部分,将wParam指向的字符串复制到ss类型。

答案 1 :(得分:2)

根据documentationWM_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位上移植。