Текстовые сообщения 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 сообщения снова и снова, что будет иметь негативные последствия для производительности, поскольку ваши программы становятся все больше и больше.

Другие вопросы по тегам