Как мне преобразовать wParam в CString? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть pMsg->wParam из сообщения WM_KEYDOWN, и я хочу преобразовать его в CString.Как я могу это сделать?

Я попробовал следующий код:

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

, но он не работает для символов высокого ASCII.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Согласно документации , 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 битности.

2 голосов
/ 16 февраля 2012

Проблема в том, что wParam содержит указатель на массив символов. Это не один символ, поэтому вы не можете создать строку самостоятельно, присвоив ей ch[0], как вы пытаетесь это сделать здесь.

Решение оказалось намного проще, чем вы ожидали. Класс CString имеет конструктор, который принимает указатель на массив символов, который является именно тем, что есть в wParam.
(На самом деле, у него куча конструкторов , один для почти всего, что вам когда-либо понадобится ...)

Итак, все, что вам нужно сделать, это:

CString ss(pMsg->wParam);

Конструктор позаботится обо всем остальном, скопировав строку, указанную wParam, в тип ss.

...