如何将wParam转换为CString

How do I convert a wParam to a CString?

本文关键字:CString 转换 wParam      更新时间:2023-10-16

我有一个来自WM_KEYDOWN消息的pMsg->wParam,我想将其转换为CString。我该怎么做?

我已经尝试了以下代码:

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

但它不适用于高ASCII字符。

根据文档,WM_CHARwParam中发送一个字符代码。备注部分的第一段说,该代码实际上是一个Unicode UTF-16代码点。无论您是为8位还是16位TCHAR编译代码,都是如此。

CodyGray的评论在CString提供各种构造函数的部分是正确的。您要查找的是以wchar_t作为第一个参数的参数(第二个参数,即重复计数,默认设置为1)。因此,要从WPARAM构造CString,请将值强制转换为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位之间移植。

问题是wParam包含指向字符数组的指针。它不是一个单独的字符,所以您不能像在这里尝试的那样通过将其分配给ch[0]来自己创建字符串。

事实证明,这个解决方案比你预期的要容易得多。CString类有一个构造函数,它接受一个指向字符数组的指针,这正是wParam中的指针
(事实上,它有一堆构造函数,其中一个几乎可以满足你所需要的一切…)

所以你所要做的就是:

CString ss(pMsg->wParam);

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