Работа с графикой методами Win32 API
Как правило, непосредственное использование функций GDI требуется при рисовании чего-то такого, что недостижимо с помощью методов визуальной библиотеки компонентов Delphi, и в частности ключевого графического класса TCanvas. В таком случае надо прежде всего позаботиться о получении дескриптора контекста графического устройства, на поверхности которого мы планируем рисовать.
Контекст устройства (DC, device context) – это структура размером 64 Кбайт, автоматически создаваемая Windows и умеющая осуществлять вывод на устройство. Воспринимайте контекст устройства как связующую нить между программным кодом и областью рисования. Вместо непосредственного направления графической информации на аппаратное устройство (экран, принтер) приложение передает ее в контекст, и только затем операционная система переадресует вывод на «железо», точнее отдаст соответствующую команду драйверу устройства.
Благодаря контексту устройства процесс рисования становится аппаратно независимым, и мы можем использовать одинаковые графические процедуры для любого устройства вывода, будь то экран монитора, принтер или плоттер. Запросив у Windows дескриптор контекста устройства, вы уведомляете систему о своих намерениях использовать графическое устройство.
functionCreateDC(lpDriver, lpDevice, lpOutput : PChar; constDEVMODE :
Pointer) : hDC;
Здесь lpDriver – указатель на строку с именем файла драйвера устройства, например DISPLAY для получения дескриптора экрана; lpDevice – имя конкретного используемого устройства, например Epson LQ-100; параметр lpOutput игнорируется и всегда должен быть пуст (nil); DEVMODE – указатель на структуру, содержащую данные инициализации для драйвера устройства.
Для применения параметров по умолчанию устанавливайте DEVMODE в nil. В нижеприведенном коде дескриптор дисплея возвращается функцией CreateDC(), а удаляется DeleteDC() или ReleaseDC().
varDC:hDC;
pS:PChar;
Begin
DC:=CreateDC('DISPLAY', nil, nil, nil); // получение дескриптора
pS:=PChar('Пишем на экране');
TextOut(DC,10,10,pS,StrLen(pS));
DeleteDC(DC); // удаление дескриптора
end;
Благодаря дескриптору дисплея мы получили возможность выводить текст непосредственно на экране, а не в пределах, ограниченных рабочей формой приложения.
Для получения дескриптора клиентской области окна используется другая функция Windows:
functionGetDC(HWND : hWnd) : hDC;
Метод требует передачи всего одного параметра – дескриптора окна, для которого должен быть получен контекст устройства. Например:
DC:=GetDC(Form1.Handle);
Для того чтобы получить контекст поверхности для рисования формы, достаточно воспользоваться свойством Handle холста этой формы:
DC:=Form1.Canvas.Handle;
Еще одна полезная функция GDI обеспечит вас подробной информацией о параметрах графического устройства:
functionGetDeviceCaps( DC : hdc, nIndex : integer) : integer;
В качестве параметров функции выступают уже знакомый нам дескриптор DC и идентификатор nIndex. Идентификатор может принимать значения ряда констант, объявленных Windows, например: HORZSIZE – ширина физического экрана в миллиметрах, VERTSIZE – высота в миллиметрах, HORZRES – ширина экрана в пикселах, VERTRES – высота в пикселах и т. д.
procedureTForm1.FormResize(Sender: TObject);
varMWidth, MHeight:integer;
Begin
MHeight:=GetDeviceCaps(Canvas.Handle,VERTRES)-100;
MWidth:=GetDeviceCaps(Canvas.Handle,HORZRES)-100;
ifForm1.Height>MHeight thenForm1.Height:=MHeight;
ifForm1.Width>MWidth thenForm1.Width:=MWidth;
end;
В приведенном примере вертикальный и горизонтальный размеры формы не могут превышать соответственно высоту и ширину экрана монитора за вычетом 100 пикселов.
Обновление области
В арсенале Windows GDI имеется полезная функция, указывающая системе о необходимости перерисовать некоторую прямоугольную область:
functionInvalidateRect(hWnd : HWND ; lpRect : pRect; Erase : Boolean) : Boolean;
Здесь hWnd – дескриптор окна, чья поверхность будет обновлена; lpRect – указатель на структуру TRect, хранящую координаты прямоугольника;
Erase – параметр, определяющий, есть ли необходимость в стирании прямоугольника перед его перерисовкой (true).
varrct : TRect;
Begin
rct:=Rect(10,10,100,100);
INVALIDATERECT(Form1.Handle,@rct,true);
end;
Схожую задачу решает функция Windows GDI под названием InvalidateRgn(). В отличие от своей коллеги, обновляющей прямоугольную область, эта функция инициирует перерисовку региона.
Дата добавления: 2016-03-15; просмотров: 1046;