1

WM_KEYDOWNメッセージからがありpMsg->wParam、それをに変換したいと思いますCString。どうやってやるの?

私は次のコードを試しました:

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

ただし、拡張ASCII文字では機能しません。

4

2 に答える 2

3

ドキュメントによると、WM_CHARで文字コードを送信しますwParam。備考セクションの最初の段落は、コードが実際にUnicodeUTF-16コードポイントであると述べています。これは、コードを8ビットまたは16ビットのどちらでコンパイルする場合にも当てはまりますTCHAR

CodyGrayのコメントはCString、さまざまなコンストラクターを提供する部分で正しいです。あなたが探しているのはwchar_t、最初の引数としてaを取るものです(2番目の引数である繰り返し回数はデフォルトで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ビットで移植可能です。

于 2012-02-16T14:44:28.490 に答える
2

問題は、文字の配列へのポインタwParamが含まれていることです。これは単一の文字ではないため、ここで実行しようとしているように、文字列を割り当てて自分で文字列を作成することはできません。ch[0]

解決策は、おそらく予想よりもはるかに簡単であることがわかりました。このCStringクラスには、文字配列へのポインターを受け取るコンストラクターがあります。これは、まさにあなたが持っているものですwParam
(実際には、コンストラクターがたくさんあります。1つは、これまでに必要となるほとんどすべてのものに対応します...)

だからあなたがしなければならないのは:

CString ss(pMsg->wParam);

コンストラクターが残りを処理し、が指す文字列を型にコピーしwParamますss

于 2012-02-16T06:55:23.300 に答える