WM_KEYDOWNメッセージからがありpMsg->wParam
、それをに変換したいと思いますCString
。どうやってやるの?
私は次のコードを試しました:
TCHAR ch[2];
ch[0] = pMsg->wParam;
ch[1] = _T('\0');
CString ss(ch);
ただし、拡張ASCII文字では機能しません。
WM_KEYDOWNメッセージからがありpMsg->wParam
、それをに変換したいと思いますCString
。どうやってやるの?
私は次のコードを試しました:
TCHAR ch[2];
ch[0] = pMsg->wParam;
ch[1] = _T('\0');
CString ss(ch);
ただし、拡張ASCII文字では機能しません。
ドキュメントによると、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ビットで移植可能です。
問題は、文字の配列へのポインタwParam
が含まれていることです。これは単一の文字ではないため、ここで実行しようとしているように、文字列を割り当てて自分で文字列を作成することはできません。ch[0]
解決策は、おそらく予想よりもはるかに簡単であることがわかりました。このCString
クラスには、文字配列へのポインターを受け取るコンストラクターがあります。これは、まさにあなたが持っているものですwParam
。
(実際には、コンストラクターがたくさんあります。1つは、これまでに必要となるほとんどすべてのものに対応します...)
だからあなたがしなければならないのは:
CString ss(pMsg->wParam);
コンストラクターが残りを処理し、が指す文字列を型にコピーしwParam
ますss
。