Работа с графикой методами 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.