Класс TTimer
WM_TIMER
. Сообщения получает невидимое окно, создающееся специально для этого. Поэтому событие OnTimer
за час при секундном интервале также возникнет меньше, чем 3600 раз.Некоторую специфику имеют и сообщения от клавиатуры. При обработке таких сообщений можно использовать функцию GetKeуState
GetKeyState
использовать при обработке не клавиатурного сообщения, оно вернет состояние клавиши на момент последнего извлеченного из очереди клавиатурного сообщения.1.1.11. Графика в Windows API
Та часть Windows API, которая служит для работы с графикой, обычно называется
TCanvas
, свойство Handle
которого содержит дескриптор контекста устройства. TCanvas
универсален в том смысле, что с его помощью рисование в окне, на принтере или в метафайле выглядит одинаково. То же самое справедливо и для контекста устройства. Разница заключается только в том, как получить в разных случаях дескриптор контекста.Большинство методов класса TCanvas
TCanvas
имеют более удобный тип, чем функции GDI. Например, метод TCanvas.Polygon
требует в качестве параметра открытый массив элементов типа TPoint
, а соответствующая функция GDI — указатель на область памяти, содержащую координаты точек, и число точек. Это означает, что до вызова функции следует выделить память, а потом — освободить ее. Еще нужен код, который заполнит эту область памяти требуемыми значениями. И ни в коем случае нельзя ошибаться в количестве элементов массива. Если зарезервировать память для одного числа точек, а при вызове функции указать другое, программа будет работать неправильно. Но для простых функций работа через GDI ничуть не сложнее, чем через TCanvas
. Для получения дескриптора контекста устройства существует много функций. Только для того, чтобы получить дескриптор контекста обычного окна, существуют четыре функции: BeginPaint
, GetDC
, GetWindowDC
и GetDCEx
. Первая из них возвращает контекст клиентской области окна при обработке сообщения WM_PAINT
. Вторая дает контекст клиентской области окна, который можно использовать в любой момент времени, а не только при обработке WM_PAINT
. Третья позволяет получить контекст всего окна, вместе с неклиентской частью. Последняя же дает возможность получить контекст определенной области клиентской части окна.После того как дескриптор контекста получен, можно воспользоваться преимуществами класса TCanvas
Handle
полученный дескриптор. Освобождение ресурсов нужно проводить в следующем порядке сначала свойству Handle присваивается нулевое значение, затем уничтожается экземпляр класса TCanvas
, после этого с помощью подходящей функции GDI освобождается контекст устройства. Пример такого использования класса TCanvas
демонстрируется листингом 1.17.TCanvas
var
DC: HDC;
Canvas: TCanvas;
begin
DC:= GetDC(…); // Здесь возможны другие способы получения DC
Canvas:= TCanvas.Create;
try
Canvas.Handle:= DC; // Здесь рисуем, используя Canvas
finally
Canvas.Free;
end;
// Освобождение объекта Canvas не означает освобождения контекста DC
// DC необходимо удалить вручную
ReleaseDC(DC);
end;
Использование класса TCanvas