GDI графики в Делфи

Жаргонът GDI.

GDI означава Graphics Device Interface, и е интерфейс, който Windows използва за изготвяне на 2D графика. Също така, това е най-бавния начин за показване на графика на съществуващите, но най-лесно да разберат основите. Така че, за да започнете, нека да поговорим за основните понятия и термини на GDI.







Да започнем с това, ИРП не обикновено се използва за създаване на страхотни ефекти на изображението, това е DirectX, OpenGL, или който и да е графична библиотека (като например:. DelphiX, FastLib, DIBUltra, Graphics32). Въпреки това, за да създадете прости ефекти с минимални усилия GDI е доста лошо.

С GDI е тясно свързан друг акроним - DC ( "контекст Device" - контекст устройство). Това е, което ние се възползва от, и в Делфи контекст устройство е представено като TCanvas. Идеята за контекста на устройството е, че то е универсално устройство за печат, така че можете да използвате една и съща функция за екран, така и принтер.

Всички функции на графични в Делфи е построен на стандартните функции GDI Windows. По-късно ще говорим за тези функции.

И сега е време да се пристъпи към разглеждане на това как GDI. Таблицата по-долу представя някои важни класове:

Той използва за да се направи изчистени линии. Обикновено се използва за функция LineTo или чрез теглене на рамки за някои форми (като функция правоъгълник).

Четка използва за запълване на площта на определен цвят. Той се използва в функциите правоъгълник FillRect или FloodFill.

Той се използва за определяне на шрифта, в който ще бъде изтеглен в текста. Можете да укажете името на шрифта, размер и т.н.

Тя ви позволява да определите региона (затворено пространство). Районът може да бъде кръг, квадрат, или произволна форма. Тя ви позволява да вършат същата дупка на фигурите.

Въпреки това, че е време да се премине от думи към действия, а именно, за да започнете да изготви линии и форми.

Рисуване линии

Първо трябва да бъде ясно разбира, че координатната (0,0) е в горния ляв ъгъл на екрана. Това означава, че стойностите на увеличението на оста у надолу по екрана. Съответно, координатната (0, 50) означава, че ние просто отстъпи с 50 пиксела от горната част на екрана.

Най-важното нещо е да се знае, когато се изготви линии и форми, това е разликата между писалка (Pen) и четка (Brush). Това е много проста: писалката (Pen) се използва за рисуване линии или рамки, и четка (Brush) за попълване на форми.

По-долу са две функции, които се използват, за да изготви линии и двете принадлежат към TCanvas:

Премества началната точка на чертежа на линията до посочените координати х и у

Обръща линия от текущата позиция (вж. MoveTo) към координатите х и у.

Ефектът от преместването на началната точка на теглене на линия, както и постига чрез инсталиране svostva PenPos в платното. например, "Canvas.PenPos.x: = 20;", "Canvas.PenPos.y: = 50", или "Canvas.PenPos: = Point (20,50);".

По подразбиране, началната точка на чертежа е настроен на (0,0), което е, ако просто се обадя "Canvas.LineTo (100100);" след това да го тегли чертата от точката (0,0) до точка (100, 100). започнете да чертаете точка автоматично се премества към (100, 100), което е, ако изпълните командата "Canvas.LineTo (200, 100);", на следващия ред ще бъде изтеглен от точката (100, 100) до (200, 100). Ето защо, ако искаме да се направи линия nesoedinonnye един с друг, трябва да се използва метод MoveTo.

Линията изготвен с помощта на ток писалка LineTo използва платното (тип TPen). Основните свойства на писалката, ширината - "Canvas.Pen.Width: = 4;" (С които можете да изберете различна ширина на линията) и цвят "Canvas.Pen.Color: = clLime;".

Нека разгледаме един прост пример на случаен чертеж цветни линии:

процедура DrawLines се нарича от един бутон манипулатор OnClick. Броят на линиите е разположен в NUM_LINES постоянна. Между другото, RGB функция е цветът на всеки ред от три основни компонента: червено, зелено и синьо (стойности от 0 до 255) и ни връща цвета под формата на TColor. За цветове говорят малко по-късно, но ето какво изрисуван пейзаж:

Сега, след като линии, като се опитате да се движат малко по форма. Ако преместите на формата на екрана, ще видите, че линиите са частично изтрити. Това не е бъг, а да се реши този проблем е много проста. Но не сега ;-). Първо, нека да видим как да се изготвят различни форми.







Рисуване форми

За да начертаете фигури в TCanvas осигурява следните функции:

Обръща даден низ върху платно, тъй като координатите (X, Y) - цвета на фона на текста, е изпълнен с текущата четката.

Canvas.TextOut (10, 10, "е част от текста");

Между другото, функцията ви позволява да изготви текст, без да го попълните с фона. Ако е необходимо да промените шрифта, използван в TextOut, трябва да смените шрифта собственост на платното (този имот е от тип TFont) - например "Canvas.Font.Name: =" Verdana ";", "Canvas.Font.Size: = 24;" или "Canvas.Font.Color: = clRed;".

Накратко, аз бих искал да привлека вниманието ви към един доста полезен клас на TRect, който е в състояние да съхранява стойност наляво, надясно, отгоре и отдолу (между другото, в API Windows е RECT). След това изяжте достатъчно, за да се уточни ляво и отгоре координира и ширината и височината на района, но TRect автоматично попълва във формата (вляво, отгоре, отляво, ширина, височина и височина). И все пак има и друга функция Rect (), който прави същото нещо, но координатите в него са изложени директно като ляво, дясно, отгоре и отдолу. Е, ако желаете, можете да използвате функцията за API SetRect.

По-долу е извадка, която привлича най-случайни различни цифри:

Както вече сте забелязали, някои цифри имат цвят рамка различен от цвета, който изпълни на фигурата. Точно това е точката, която споменах по-горе. Четка пълним обекти и пера рамкиране. Ако цветът на четка (четка) променя произволно, цветът на писалката (писалка) остава постоянно. Поради това, и се оказва, тази снимка.

пречертаване на прозорец

Сега, нека да разбера защо в първия пример, ние изтрити, когато се движат под формата на екрана. А именно, че трябва да се изясни разликата между "рисуване" и "преначертае".

Преначертаване малко по-различен от "чертеж" на понятието. Когато е необходимо да бъде пребоядисан прозореца Windows изпраща определено съобщение. Това съобщение идва "OnPaint" манипулатор събитие. Всеки код, който се поставя в манипулатор OnPaint ще се нарича, когато трябва да се актуализира формата.

Например, поставете следния код в проекта:

Ако сложите върху бутона, за да форма и причината за DrawSomeText манипулатор бутон OnClick, тогава проблемът е с изчезването на текста ще бъде, когато се движат форма. Въпреки това, ако причината за DrawSomeText OnPaint манипулатор форма, а след това текстът ще остане в сила за постоянно.

Описания, или да се използват едни и същи функции API

Така че сме се научили да изготви линии, различни фигури са се научили да правят това, че нашето творение не се изтрива, когато се движите на формата, и ние сме сторили всичко това с помощта на стандартните функции VCL (като Canvas.TextOut и т.н.). Все пак, това, което, ако не искате да използвате графичните функции VCL, които просто е построен на подобни функции от Windows API? Моля ви! Никой не ни забранява да не се използва API функции директно! Но чакайте, всички те изискват някои HDC! Каква е HDC?

Почти всичко в Windows използва "ЕВРОВОК" (дръжка). Дръжката е метод за идентифициране на обект в системата ви. Всеки прозорец има своя собствена дръжка, всеки бутон има и собствен дръжка и т.н. Ето защо всички наши съоръжения има дръжка като собственост - например, "MyForm.Canvas.Handle".

HDC този тип ЕВРОВОК (дръжката) контекст устройства (контекст Device). Вече казах в началото, че TCanvas включва повечето от функциите на DC. Ето защо, ние можем лесно да замени платно имот се справят с, където имаме нужда от нея.

За забавление, можете да погледнете таблицата, която показва примери за разговори на някои функции на VCL и техните колеги от API на Windows.

Можете да използвате различни маркери за изготвяне на различни места. Например, можете да използвате "SomeBmp.Canvas.Handle" Рисуване на картина (растерна графика) или "Form1.Canvas.Handle", за да се направи във формуляра.

Необходимо е версия на API на функция TextOut да премине серия от завършен нула. Това означава, че вместо да се налага да премине низ във функция директно, трябва да го мине за PChar. Само не забравяйте да мине по дължина функция низ. За да направите това, можете да използвате дължина.

Е, вие вече искаше да постави на формата на някои красива картина.

Какво е Bitmap (Bitmaps)?

Рисуване линии, той със сигурност е добро, но рано или късно ще трябва да се направи по-реалистична kartniku в молбата Ви. Поради това е необходимо да се научите да работите с растерни изображения, или както те са известни сред програмистите - растерни изображения.

Bitmap, е графично обект, който съдържа глава с необходимата информация за картината (като височина, ширина, цвят и т.н.) и в действителност, самото изображение (голям масив, съдържащ цвета на всяка точка). В Делфи за тази цел вече е осигурена TBitmap клас.

Bitmaps могат да изготвят не само формата, но и на целия екран. Може би това може да изглежда малко странно, но понякога това може да бъде полезно, особено при създаването на скрийнсейвър. Въпреки това, първо трябва да се справят с това как да се работи с растерни изображения. Ето един пример:

Тази функция се опитва да зареди и дисплей картина (с име Име на файл, например "myBitmap.bmp"), започвайки от точката (х, у).

Аз трябва да кажа, че тази функция е доста неефективен. Той създава и унищожава растерна графика, когато се нарича, както и всяка проверки време съществуване на файла. По-добре е да обяви TBitmap обект като част от формата, за да създадете и качите снимка в FormCreate, и да я освободите в FormDestroy.

изготвяне функции в GDI

TCanvas има няколко полезни функции, които работят с тип TGraphic. тип TGraphic е базовия клас за графични обекти в Delphi, като растерни (TBitmap), икони (TIcon), мета (TMetafile) и JPEG-и (TJPEGImage). Всички те използват едни и същи функции, които са показани в таблицата:

Всички тези функции са TCanvas методи.