Текстовые сообщения winapi с сообщениями клавиатуры
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[1];
switch (message)
{
case WM_CHAR:
szBuffer[1] = (TCHAR) wParam;
cout << wParam << " " << szBuffer[1] << " ";
break;
case WM_PAINT:
InvalidateRect(hwnd, NULL, TRUE);
hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
TextOut(hdc, 1, 1, szBuffer, 1);
EndPaint(hwnd, &ps);
return 0;
Привет всем, я пытаюсь запустить приведенный выше код и просто напечатать одну букву за раз в моем окне. Тем не менее, я не могу заставить символы появляться в окне с помощью функции TextOut, но могу отображать символы в окне терминала. Я новичок в WinApi и потерян!
заранее спасибо!
1 ответ
Ваш szBuffer
является локальным для WndProc()
и по умолчанию локальные переменные в C имеют автоматическое хранение: каждый раз, когда ваш WndProc()
называется, новый szBuffer
создан, так что к тому времени ваш WM_PAINT
достигнуто, все, что было набрано в WM_CHAR
был потерян. Вам нужно будет хранить szBuffer
где-то еще, например снаружи WndProc()
или объявить это как static
, который будет держать буфер вокруг (но учтите, что статическое хранилище НЕ безопасно для рекурсии).
Также в C первый элемент массива имеет индекс 0, а не 1; линия szBuffer[1] = (TCHAR) wParam;
должно быть szBuffer[0] = (TCHAR) wParam;
делать то, что вы хотите.
Поскольку я работаю с предположением, что вы новичок в C, см. Комментарий Джонатана Поттера о наличии в ваших строках дополнительного символа, значение которого равно нулю (не код символа для цифры ноль, а числовое значение 0 или '\0'
или же L'\0'
). В то время как TextOut()
и другие функции рисования текста GDI не используют эти строки с нулевым символом в конце, все остальное в C делает. Осторожно.
И комментарий Джо Уилкоксона также верен. InvalidateRect()
помещает данный прямоугольник в очередь для перекраски. Используя это в вашем WM_PAINT
обработчик заставит вас всегда получать WM_PAINT
сообщения снова и снова, что будет иметь негативные последствия для производительности, поскольку ваши программы становятся все больше и больше.