ПредишенСледващото

Използването на четки, химикалки, и шрифтове в GDI е коренно различна от начина, по който се извършва в VCL. TCanvas клас има свойствата на Pen. Четка. и шрифта. промени в свойствата на което води до избора на писалка, четка, шрифт. The GDI тези обекти са независими, трябва да бъдат създадени, за да получите своята дръжка "избран" да контекста на желаното устройство, използвайки SelectObject функция и да се изхвърлят след употреба. И можете да изтриете само тези обекти, които не са избрани по някакъв контекст. Има и редица стандартни обекти, които не се нуждаят или да създадете или изтриете. Техните дръжки могат да бъдат получени при използване на функция GetStockObject. Например, помислете за фрагмент от код, който се основава на контекст ЕВРОВОК DC две линии: в синьо и червено (вижте обявата 1.18). Този код се използва, че SelectObject връща дръжката на обект, свързани избра, който беше избран по-рано. Така че, при избора на нова писалка, той се връща манипулатор към писалката, която е била избрана преди това.

Обявата 1.18. Рисуване различни пера, използващи GDI

SelectObject (DC, CreatePen (PS_SOLID, 1, RGB (255, 0, 0)));

MoveToEx (DC, 100, 100, нула);

LineTo (DC, 200, 200);

DeleteObject (SelectObject (DC, CreatePen (PS_SOLID, 1, RGB (0, 0, 255))));

MoveToEx (DC, 200, 100, нула);

LineTo (DC, 100, 200);

GDI обект описания имат смисъл само в рамките на процеса, който ги е създал, те не могат да се предава между процесите. Въпреки това, от време на време може да намерите на твърдението, че такова прехвърляне е възможно. Източникът на тази грешка е. GDI възрази дръжки, които могат да се предават между процесите в по-старите, 16-битови версии на Windows, така че всички твърдения за възможността за подобен трансфер просто на базата на остаряла информация.

За съхранение на растерни изображения в Windows, има три формата: DDB, DIB и DIB сечение. DDB - во Зависим Format, форматът, определен от графика устройството, на което е налице заключение. DIB - е Device Independent Bitmap, формат, общи за всички устройства. DIB формат - е остарял формат, който не позволява използването на графични GDI функции за промяна на изображението, можете да промените изображението, само един начин: ръчна промяна на цветовете на отделните пиксели. В 32-битова версии имат друг формат - DIB сечение. В действителност тя е една и съща DIB, но добавянето на възможности да се възползват от него с помощта на GDI-функции. Всички разлики между трите формата могат да бъдат намерени в прекрасна книга [1]; Ние се ограничим тук, за да се прави кратък преглед на тях.

DIB сечение може да се съхранява във всяка област на паметта, размерът му е ограничен само от размера на наличната памет за приложения, функциите GDI да ползва този образ, използвайки чисто софтуерни алгоритми, по никакъв начин, без да използвате хардуерен ускорител. DIB сечение поддържа различна дълбочина на цвета и директен достъп до зоната на паметта, в която се съхранява изображението. DIB сечение от едно преносимо устройство на друго. BMP файлове се съхранява изображението като DIB.

Клас TBitmap може да се съхранява изображението като DDB, и като секция DIB- - се определя от свойствата PixelFormat. PfDevice стойност означава използването на DDB, други ценности - DIB сечение с различен цвят. По подразбиране TBitmap създава pfDevice формат на изображението. но програмистът да промените формата по всяко време. Това създава нов имидж на желания размер, старите се копира в него и унищожена.

С PixelFormat имотния тясно свързани HandleType собственост. което може да отнеме на ценностите и bmDIB bmDDB. PixelFormat промяна имот води до промяна в свойствата на HandleType. и обратно.

Когато изображението се зарежда от даден файл, ресурс или клас TBitmap поток обикновено създава изображение формат DIB сечение, цветът на съответната дълбочина източник. Изключения са компресирани файлове (BMP формат поддържа компресия само за 16- и 256-цветни изображения) - в този случай, DDB. Графичният файл дефинира глобалната променлива DDBsOnly. която по подразбиране е False. Ако промените стойността на True. изтегляне на изображения винаги ще има формата DDB.

Клас TBitmap има ScanLine собственост. чрез която можете да получите директен достъп до масив от пиксели, които съставят изображение. Бележката се казва, че този имот може да се използва само с DIB-изображения. Но в действителност, DDB изображение също се позволи използването на този имот, макар и със значителни ограничения. Ако изображението се съхранява в DDB- формат при достъп ScanLine го създадете DIB-копие ScanLine и връща указател към масив от копия. Ето защо, от една страна, ScanLine работа с DDB-изображения е много бавно, и второ, не работи с изображението и неговото копие, което предполага следните ограничения:

1. Копие е създадена по време на лечението, за да ScanLine. Поради промени, направени в изображението с помощта на GDI-функции след това да са достъпни.

2. Всяка покана за ScanLine създава ново копие на снимката, както и старото в същото време унищожена. Гаранция, че ново копие ще бъде разположена в една и съща област на паметта, то не е, така че показалеца, получен чрез предварителна покана за ScanLine. вече не се използва.

3. Направени са промени подредба на пикселите, се отнася само за копие на изображението, но самото изображение не се променя. Ето защо, в случай на DDB ScanLine функция дава възможност да се чете, но не променят картината.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!