Уроки Iczelion'а



         

Урок 6. Клавиатура - часть 3


.ELSEIF uMsg==WM_CHAR

push wParam pop char invoke InvalidateRect, hWnd,NULL,TRUE

Это было добавлено в процедуру окна для обработк сообщения WM_CHAR. Она всего лишь помещает символ в переменную char и затем вызывает InvalidateRect, что вынуждает Windows послать сообщение WM_PAINT процедуре окна. Синтаксис этой функции следующий:

InvalidateRect proto hWnd:HWND,\ lpRect:DWORD,\ bErase:DWORD

lрRect - указатель на прямоугольник в клиентской области, который мы хотим объявить требующим перерисовки. Если этот параметр равен NULL'у, тогда вся клиентская область объявляется такой. bErase - флаг, говорящий Windows, нужно ли уничтожать бэкграунд. Если он равен TRUE, тогда она делает это при вызове функции BeginPaint.

  • Таким образом, мы будем использовать следующую стратегию: мы сохраним всю необходимую информацию, относящуюся к отрисовке клиентской области и генерирующую сообщение WM_PAINT, чтобы перерисовать ее. Конечно, код в секции WM_PAINT должен знать заранее, что от него ожидают. Это кажется обходным путем делать дела, но это путь Windows.

  • Hа самом деле, мы можем отрисовать клиентскую область в ходе обработки сообщения WM_CHAR, между вызовами функций GetDC и ReleaseDC. Hет никаких проблем с этим. Hо вся забава начнется, когда приложению понадобится перерисовать клиентскую область. Так как код, рисующий символ находится в секции WM_CHAR, программа не сможет перерисовать символ в клиентской части. Поэтому помещайте все необходимые данные и код, отвечающий за pисование в WM_PAINT. Вы можете послать это сообщение из любого места вашего кода, где вам нужно перерисовать клиентскую область.

  • invoke TextOut,hdc,0,0,ADDR char,1

    Когда InvalidateRect вызванна, она шлет сообщение WM_PAINT обратно процедуре окна, поэтому вызывается код в секции WM_PAINT. Он вызывает BeginPaint, чтобы получить хэндл контекста устройства, и затем вызывает TextOut, рисующая наш символ в клиентской области в x=0, y=0. Когда вы запускаете программу и нажимаете любую клавишу, вы увидите, что символьное эхо в верхнем левом углу клиентского окна. И когда окно минимизируется и максимизируется, символ все равно там, так как все код и все данные, необходимые для перерисовки располагаются в секции WM_PAINT.

    [C] Iczelion, пер. Aquila.






    Содержание  Назад  Вперед