71
Вежба : Со оваа вежба ќе направиме апликација слична на PaintBrush под оперативниот систем Windows. Вежбата ќе оди чекор по чекор, а ќе научиме и други можности на Delphi. Ќе работиме чекорно. Основните чекори се: Реагирање на глушец , Додавање полиња во објектот на формата, Цртање линии, Додавање tool bar на формата, Додавање speed button на tool bar, Реагирање на кликањa на копчињата од глушецот , Цртање со различни алатки, Прилагодување на перото и четката, Додавање status bar, Цртање на bitmapi, Додавање менија, Печатење графика, Работа со графички датотеки, Користење Clipboard со графика.

Vezba Paintce

Embed Size (px)

Citation preview

Page 1: Vezba Paintce

Вежба :

Со оваа вежба ќе направиме апликација слична на PaintBrush под оперативниот систем Windows. Вежбата ќе оди чекор по чекор, а ќе научиме и други можности на  Delphi. Ќе работиме чекорно.Основните чекори се:

Реагирање на глушец,Додавање полиња во објектот на формата,Цртање линии,Додавање tool bar на формата,Додавање speed button на tool bar,Реагирање на кликањa на копчињата од глушецот,Цртање со различни алатки,Прилагодување на перото и четката,Додавање status bar,Цртање на bitmapi,Додавање менија,Печатење графика,Работа со графички датотеки,Користење Clipboard со графика.

Page 2: Vezba Paintce

чекор – Реагирање на глувче

Постојат четири типа акции со глувчето на кои апликацијата може да реагира. Три од нив се единствено за глушецот:копче на глувчето долу (глувче долу),   OnMouseDownглувчето е поместено и OnMouseMoveкопче на глувчето горе (глувче горе) OnMouseUp

Во оваа вежба нашата апликација ќе црта облици како одговор на кликања и поместувања: кликање на копче на глувчето покренува цртање, a отпуштање на копчето на глувчето го завршува цртањето. Исто така апликацијата ќе црта привремена слика на цртежот додека поместуваме  глувче, додека копчето на глувчето е кликнато.

Page 3: Vezba Paintce

Постојат три настани за глувчето, дефинирани во Delphi: OnMouseDown, OnMouseMove, OnMouseUp.

Кога апликацијата пишувана во Delphi, детектира работа со глувче, го повикува event handler дефиниран за соодветниот настан, пренесувајќи му неколку параметри. Параметрите се следните

Параметар Значење

Sender Објект кој детектирал акција на глувчето

Button Покажува кое копче на глувчето е вклучено:mbLeft,mbMiddle или mbRight.

Shift Покажува состојба на копче Alt, Ctrl и Shift во моментот на акција на глувчето.

X,Y Координати на кои доаѓа акција со глувчето

Во повеќе случаи, најважната информација во event handler‐от на глувчето се координатите, но понекогаш ќе проверете Button, за да одредете кое копче го предизвика настанот.

Page 4: Vezba Paintce

OnMouseDownКога корисникот ќе притисне копче на глувчето, настанот OnMouseDown е активиран. Тогаш објектот може да реагира на настанот.пример: Ќе направиме апликација кај која кога и да притиснеме копче на глувчето над формата почнува да испишува некој текст.Да креираме event handler OnMouseDown за самата форма.

procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.TextOut(X,Y,' Ovde Sum na ('+inttostr(x)+','+inttostr(y)+') ');end;

Значи овде искористивме параметри X и Y да добиеме точна позиција на глувчето кога ќе кликнеме и на таа позиција го испишуваме текстот со методата TextOut за пишување текст

Page 5: Vezba Paintce

Апликацијата уште не е во состојба да црта линија. Кликот на копче и кажува на апликацијата каде ќе почне со цртање, a за линија потребна е и крајна точка.Ќе го спомнеме овој event handler, за поставување позиција на цртање на координати каде корисникот ќе кликне на глувчето:

procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.MoveTo(X,Y);

end;

Овде кликот на копчето ја поставува позицијата на перото, поставувајќи почетна точка за линијата.  Сега треба да нацртаме линија на која корисникот го отпушта копчето. За таа цел треба да напишеме реакција на настан на глувчето горе.

Page 6: Vezba Paintce

OnMouseUp

Настанот OnMouseUp се извршува секогаш кога корисникот ќе ослободи кликнатото копче, настанот е за објект над кој е покажувачот на глувчето кога копчето е ослободено. Ни овозможува да цртаме, пример: Линија како да излегува од рамката на формата.

Значи дефинираме event handler OnMouseUp за формата ќе ја именувамеfrmCrtko.procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.LineTo(X,Y);end;

Со апликацијата можеме да цртаме линии со клик, повлекување и ослободување на копчето на глувчето. Меѓутоа, линијата не се гледа додека не го ослободите копчето. Во продолжение креираме код кој ќе даде повратна информација цртајќи привремени линии додека глувчето се движи.

Page 7: Vezba Paintce

OnMouseMove

Настанот OnMouseMove се случува периодично, кога корисникот го поместува глувчето.Треба да дефинираме OnMouseMove настан. Дефинирајте OnMouseMove event handler за формата.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginCanvas.LineTo(X,Y);end;

Кога ќе започна апликацијата забележуваме дека поместување на глувчето над формата причинува цртање кое го следи глувчето,  дури и пред клик на копчето. Настанот се извршува и без клик на глувчето.Мораме да додадеме наредби во апликацијата така да линијата се исцртува само на клик на глувчето.За водење сметка дали копчето е кликнато, потребно е да додадеме поле на објектот на формата.

Page 8: Vezba Paintce

2. чекор – Додавање поле во објектот на формата

Кога додаваме компонента на формата, Delphi додава поле кое ја претставува таа компонента на објектот на формата, и се разбира може да ја повикувате компонентата со името на нејзиното поле. Можете да додадете свои полиња во формата со уредување на декларацијата на типот на врвот unit на формата.

Во нашиот пример треба да се води сметка дали корисникот притиснал копче на глувчето. За да го направите тоа треба да додадете Boolean поле на променлива и да ја поставите неговата вредност кога корисникот ќе притисне копче.За додавање поле односно променлива уредете го editor kod‐от специфицирајќи идентификатор на полето и тип после директивата public на дното на декларацијата.Delphi е сопственик на било која декларација пред директивата public; тука става полиња кои претставуваат контроли и методи кои одговараат на настани.Формата за да има поле по име CrtaSe од тип Boolean, внесете во директиватаpublic CrtaSe Boolean;

Page 9: Vezba Paintce

Прикажано е на сл.

typeTfrmCrtko = class(TForm)procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

private{ Private declarations }publicCrtaSe:  Boolean:{ Public declarations }end;

Page 10: Vezba Paintce

Додадете уште две полиња TPoint, првото именувајте го PocеtnaTоcka, a второтоKrajnaTоcka:typeTfrmCrtko = class(TForm)procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

private{ Private declarations }publicCrtaSe:  Boolean:PocetnaTоcka, KrajnaTоcka: TPoint;{ Public declarations }end;

Page 11: Vezba Paintce

Сега кога имаме променлива CrtaSe, со чија помош водиме сметка дали е потребно да се црта, треба да се сетира на True кога корисникот ќе притисне копче на глувчето, и на False кога ќе го ослободи копчето.

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);

end;

procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.LineTo(X,Y);CrtaSe:= False;  end;

Page 12: Vezba Paintce

После оваа модификација, модифицирајте го event handler OnMouseMove за да истиот црта кога е променливата CrtaSe True.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenCanvas.LineTo(X,Y);

end;

Сега линијата се црта само помеѓу клик и пуштање на копчето од глувчето, но тоа не е многу корисно. Се уште се добиваат кривилести линии кои го следат поместувањето на глувчето наместо прави линии, а немаат врска меѓу почетната и крајната точка.

Проблемот е што секогаш кога доаѓа до поместување на глувчето се повикуваLineTo, која ја поместува позицијата на перото, до времето додека не го ослободите копчето сте ја изгубиле точката од која линијата требаше да почне.Во следниот дел ќе користиме променлива PocetnaTоcka, и KrajnaTоcka.

Page 13: Vezba Paintce

3. чекор – Цртање линии

Првиот чекор кој ќе го направиме е водење сметка за почетната точка на линијата, за да можеме да ја нацртаме конечната линија.

3.1. Бележење на почетната линијаНајбитната работа за која треба да се води сметка кај цртањето линии е почетокот на линијата. Знаеме каде таа завршува, зошто тоа е место каде копчето е ослободено. Event handler OnMouseUp треба да знае каде започнува линијата. На сцена стапува полето PocetnaTоcka.Сетирајте PocetnaTоcka да покажува на место каде копчето на глувчето е кликнато, така да кај ослободувањето на глувчето, почетната точка биде прецизно одредена.

Page 14: Vezba Paintce

procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);CrtaSe:= False;  end;

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);

end;Овие промени доведуваат до тоа апликацијата да ја црта крајната линија повторно , но што со цртањето во меѓувреме.

Page 15: Vezba Paintce

Значи проблемот е со event handler OnMouseMove, односно додека се црта линијата од моменталната позиција на глувчето, тој црта и линија од последната позиција на глувчето, а не од почетната позиција.Сега кога апликацијата води сметка за почетната точка, проблемот може лесно да се отстрани. Поместете ја позицијата за цртање на почетната точка, и потоа цртајте до моменталната точка.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenbeginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;end;

Page 16: Vezba Paintce

Сега полето е врзано да добиете линија до моменталната позиција на глувчето. За жал и останатите линии се тука, па тешко е да се каже која линија е крајна.

Трикот е во тоа да се избрише секоја линија пред да се исцрта следната, а тоа значи да водиме сметка за тоа каде се наоѓала претходната линија. За таа намена ни служи променливата KrajnaTоcka, која порано ја додадовме.

Наместете ја променливата KrajnaTоcka на крајна точка на секоја меѓулинија, така да можете да користите KrajnaTоcka и PocetnaTоcka за бришење на тие линии кај цртање на следната линија.

Page 17: Vezba Paintce

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);KrajnaTocka:=Point(X,Y);

end;procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenbeginCanvas.Pen.Mode:=pmNotXor;Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(KrajnaTocka.X,  KrajnaTocka.Y); Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;KrajnaTocka:=Point(X,Y);Canvas.Pen.Mode:=pmCopy;end;

Page 18: Vezba Paintce

Сега добивме квалитетен “rubber‐band” ефект кога повлекуваме линија. Менувајќи го mod на перото на pmNotXor, ја комбиниравме нашата линија со позадински пиксели. Кога бришеме линија, ние всушност сетираме пиксели во состојба во која биле пред да станат дел од линијата. Менувајќи го mod на перото на pmCopy (што е подразбирлива состојба) после цртање линии, перото е повторно спремно за исцртување на крајната линија кога ќе го ослободиме глувчето.

Во продолжение ќе дефинираме tool bar кој ќе ни овозможи да избираме што да цртаме односно кои облици сакаме да ги цртаме; правоаголник, елипса итн.

Page 19: Vezba Paintce

4. чекор – Додавање tool bar на формата

Tool bar е панел, обично со целата ширина на горниот дел на формата, под menu bar‐от, на кој се наоѓаат контролите, обично копчиња. Toolbar ни овозможува лесен и прегледен начин за претставување опции на нашата програма. За да додадете toolbar на формата направете следно:

Додадете компонента Panel на формата.Сетирајте ја особината Align на AlTop. Кога е порамнета со врвот на формата, панелот ја задржува својата висина, но се подесува на ширината на клиент подрачјето на формата дури и кога прозорецот ја менува големината.Додадете компонента Speed button или друга компонента на bar.

Можете да додадете онолку tool bar‐ови на формата колку ни е потребно.

Додадете tool bar во нашата програма и избришете ја неговата особина Caption.

Page 20: Vezba Paintce

5. чекор – Додавање компонента speed button на tool bar

Со Delphi добивате компонента speed button дизајнирани за користење во tool bar‐ови. Speed button обично нема на себе натпис, само мала слика која се вика glyph, која претставува функција на копчето.Speed buttoon‐ите имаат три можни начини на работа.Тие можат

Да се однесуваат како стандардни копчињаДа се вклучуваат и исклучуваат како прекинувачиДа се однесуваат како група на radio копчиња

Нашата програма Crtko ќе користи нешто од тие можности.За да поставиме speed buttun на tool bar едноставно ставете компонента speed button на панелот кој претставува tool bar. Panel‐от е сопственик на speed копчињата така да поместување или отстранување на панелот, доведува до поместување или отстранување на speed копчињата.За нашиот пример додадете 6 speed копчиња како што е прикажано на сликата и сменете ја особината Name според табелата која се наоѓа под сликата.

Page 21: Vezba Paintce

Pozicija speed button (од лево на десно) Name

1 btnLinija

2 btnPravoagolnik

3 btnElipsa

4 btnZaobPravoagolnik

5 btnPenkalo

6 btnCetka

Подразбирлива висина (height) на tool bar е 41, на speed buton е 25. Ако ја сетирате особината Top за секое speed копче на 8 ќе бидат вертикално центрирани.

Page 22: Vezba Paintce

Додавање glyph за speed button

Секое speed копче треба на себе да има графичка презентација односно представка, во delphi наречена glyph, за да покажува што работи тоа копче. Ако на speed копчето придружиме само една слика, копчето манипулира со таа слика за да покаже дека копчето е притиснато, ослободено, селектирано или оневозможено. На секое копче можно е да се доделат повеќе слики, кои ќе ги прикажат сите состојби на копчето.Вообичаено е glyph‐oвите да се доделуваат за време на креирање на програмата, а можно е за време на извршување на програмата.За да доделиме glyph за speed копче за време на креирање на програмата направете следно:Селектирајте speed button, во Object Inspector‐от, селектирајте особина Glyph, и кликнете два пати на колоната Value покрај Glyph.

Тогаш delphi отвора picture editor 

Кликнете на Load, селектирајте *.bmp датотека која содржи слика која сакате да се прикаже на speed копчето и кликнете на OK,Кликнете на OK со што Picture editor‐от се затвора.

Page 23: Vezba Paintce

Направете го ова за секој speed button за нашата програма. На следната слика е прикажан готов tool bar, а во табелата се дадени имиња на датотеки со соодветна слика. Овие датотеки се наоѓаат во директориумот c:\Temp\Glyph

Pozicija speed button (од лево на десно)

Име на датотеката

1 Line.bmp

2 Rect.bmp

3 Ellipse.bmp

4 RoundRect.bmp

5 pen.bmp

6 Brush.bmp

Page 24: Vezba Paintce

Сетирање на почетните услови на speed button

Врз основа на изгледот на speed button, корисникот заклучува во која состојба е. Бидејќи немаат натпис на себе важно е графички да се долови состојбата на speed button‐от.

За да изгледа дека speed button е кликнат, неговата особина Down се сетира на True.За да изгледа дека speed button е оневозможен, неговата особина Enabledсетирајте ја на False.

Бидејќи подразбирливата алатка за цртање линии, треба да обезбедиме копчето за цртање линии е кликнато кога програмата ќе стартува.

Сетирајте ја особината Down на speed button‐от  btnLinijа na True.

Page 25: Vezba Paintce

Креирање група speed button

Серија speed button често претставува група меѓусебно исклучиви избори. Во тој случај треба да вклучите speed button‐и во група, така да клик на било кое копче во групата предизвикува реакција на други speed копчиња во групата.

За да вклучиме било кој број speed button во група, доделете ист број на секоја особина GroupIndex. Најлесно ова се прави со селектирање на сите speed копчиња кои ги сакаме во група, и додека е групата селектирана, сетирајте GroupIndex на единствена вредност.

Бидејќи алатките за избор на обликот кој се црта се меѓусебно исклучиви, вклучете ги во група.

Селектирајте 4 алатки за цртање (4 speed button‐и од лева страна) и сетирајте го нивниот GroupIndex на 1. Сега кога ја стартувате програмата, проверете што добивте.

Page 26: Vezba Paintce

Дозволување на “прекинувачака” работа

Понекогаш ќе сакате да кликнете на копче кое е веќе кликнато во tool bar‐от, со цел тоа да се исклучи, а да ниту едно копче во таа група во tool bar‐от не биде во тој момент вклучено, т.е. сите да се исклучени. Таквото копче се вика toggle(префрли од еден режим во друг). Со помош на AllowAllUp (допушти сите горе), креирајте групирано копче кое ќе се однесува како прекинувач: кликнете го повторно и тој е горе (исклучен).

За да групирате speed button, сетирајте ја неговата особина AllowAllUp na True. Со ова автоматски е подесена особината и за останатите speed button‐и во групата на иста вредност. Со ова групата функционира на стариот начин, но можно е во групата да нема воопшто селектирани (кликнати) копчиња.

И копчето за перо и копчето за четка се однесуваат во нашата вежба како прекинувачи. Обезбедете секој да има особина AllowAllUp на True, а потоа особината GroupIndex за btnPenkalo i btnCetka сетирајте ја на 2 и 3, респективно, зошто не сакаме да припаѓаат во иста група.

Page 27: Vezba Paintce

6. чекор – Реагирање на кликања на глувче

Кога корисникот ќе кликне на контрола, како што е speed button на tool bar‐от, програмата генерира OnClick настан, тоа го знаеме. Компонентата speed button има два настани : OnClick и OnDblClick.

Delphi генерира OnClick event handler по името на кликнатата контрола.

7. чекор – Цртање со различни алатки

Графичките програми имаат потреба за водење сметка за тоа кој тип алатки за цртање ви се на располагање во било кој момент. Можете да доделите број на секој тип на алатки, но морате да знаете секој број што значи. Полесно можете да направите доделувајќи константно име на секој број, но вашата програма нема да биде во состојба да разликува кои броеви се во соодветниот ранг и дали се на вистинскиот тип. За среќа Object Pascal има начини да ги регулира обата недостатоци. Може да декларирате променлива од преброив тип.

Page 28: Vezba Paintce

Преброив тип всушност е еден вид кратенка за доделување секвенцијални вредности на константите. За да декларираме преброив тип ќе го користиме резервираниот збор type, после доаѓа идентификаторот за тип, знакот за еднаквост и идентификаторите за вредности во типот во заградите, одвоени со запирки.Ќе додадете декларација од тип TAlatkiZaCtranje над декларациите во класата форма:typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TForm1 = class(TForm)

....

....По договор, идентификаторите започнуваат со буквата T, а група на слични константи (како оние кои сочинуваат наброив тип) започнуваат со 2 мали букви кои имаат врска со името на типот (како што dt претставува “drawing tool”).Декларацијата од тип TAlatkiZaCrtanje е еквивалентна со декларацијата на група константи:constdtLinija = 0;dtPravoagolnik = 1;dtElipsa = 2;dtZaobPrav = 3;

Page 29: Vezba Paintce

Основната разлика е што се декларира преброив тип, на константната се придружува уште нешто освен вредноста, а тоа е типот кој овозможува со помош на проверка на типот во Object Pascal спречите голем број грешки. Променливата од тип AlatkiZaCrtanje може да е една од константите набројани кај декларацијата. Обидот за додавање на некој друг број (дури и оној од опсег 0..3) генерира грешка за време на компајлирањето.Сега може да додадете поле односно променлива на формата со цел водење сметка за алатката за цртање:typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TfrmCrtko = class(TForm)

.....

.....

.....private{ Private declarations }publicCrtaSe: Boolean;PocetnaTocka,KrajnaTocka:TPoint;AlatkiZaCrtanje: TAlatkiZaCrtanje;{ Public declarations }end;

Page 30: Vezba Paintce

Сега кога сте во состојба на формата да и кажете кој тип алатка да користите, единствено треба да се научи формата како да црта различни облици. Единствени методи кои цртаат се поместување на глувчето и handler за подигнување на глувчето, и единствен код за цртање кој црта само линии, без оглед која алатка е избрана.

Page 31: Vezba Paintce

Користење на алатки за цртањеВашата програма треба да одбира како да црта, врз основа на селектираната алатка.Цртањето различни облици е едноставно како и цртањето линии: двете активности користат само една наредба, а се познати сите координати.Ако имате мал избор, ќе ја измените методата за цртање така да сега изгледа вака, односно измените OnMouseUp event handler за цртање облик за сите алатки кои ги дефиниравме:procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);begincase AlatkiZaCrtanje ofdtLinija: beginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;dtPravoagolnik: beginCanvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,X,Y);

end;dtElipsa:      beginCanvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y,X,Y);

end;

Page 32: Vezba Paintce

dtZaobPrav:    begin

Canvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y,X,Y,(PocetnaTocka.X‐X),(PocetnaTocka.Y‐Y));

end;end;          {end of case}CrtaSe:=False;end; 

Page 33: Vezba Paintce

Секако треба да го измените handler‐от OnMouseMove заради нови облици:procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif CrtaSe thenbeginCanvas.Pen.Mode:=pmNotXor;case AlatkiZaCrtanje ofdtLinija: begin

Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(KrajnaTocka.X, KrajnaTocka.Y);Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;dtPravoagolnik: begin

Canvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,KrajnaTocka.X, KrajnaTocka.Y);

Canvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,X, Y);

end;

Page 34: Vezba Paintce

dtElipsa: beginCanvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y, KrajnaTocka.X, KrajnaTocka.Y);Canvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y, X, Y);end;dtZaobPrav: beginCanvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y, KrajnaTocka.X, 

KrajnaTocka.Y,(PocetnaTocka.X‐KrajnaTocka.X)div 2, (PocetnaTocka.Y‐KrajnaTocka.Y) div 2 );Canvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y, X, Y,(PocetnaTocka.X‐

KrajnaTocka.X) div 2,  (PocetnaTocka.Y‐KrajnaTocka.Y)div 2 );end;end; {end of case}KrajnaTocka:=Point(X,Y);

end;  {end of if}Canvas.Pen.Mode:=pmCopy;

end;

Page 35: Vezba Paintce

Ќе забележите дека овде има доста кодови кои се повторуваат. Всушност кодот за цртање на секој облик се повторува три различни пати. Ова е добар пример кога треба повторувачкиот код да го префрлите во посебна рутина. Во продолжение целиот код за цртање облици ќе го ставите во една метода која ја повикуваат двата  event handler‐и од глувчето.

Додавање методи односно процедури во формата

За да додадете процедура во формата направете:

Додадете декларација на метода во објектот на форма. Може да додадете декларација или во public или во private делот на крајот од декларацијата на објектот на форма. Ако кодот има детаљи за некои настани, посигурно е методата да биде private.

Page 36: Vezba Paintce

За да се ослободите од повторувачкиот код за цртање облици од event handler‐от, може да додадете метода по име CrtajShape и да ја повикате од секој handler:

Додадете декларација од CrtajShape во декларацијата на објектот на формата, така што во public ќе го запишете следното:

typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TfrmCrtko = class(TForm).........publicCrtaSe: Boolean;PocetnaTocka,KrajnaTocka:TPoint; AlatkiZaCrtanje: TAlatkiZaCrtanje;procedure CrtajShape(TopLeft,BottomRight:TPoint;AMode:TPenMode);

{ Public declarations }end;

Page 37: Vezba Paintce

Сега треба да напишеме и процедура CrtajShape, ќе го направиме додавајќи го следниот код односно процедура implementation во делот unit.implementation{$R *.DFM}procedure TfrmCrtko.CrtajShape(TopLeft,BottomRight:TPoint;AMode:TPenMode);beginwith Canvas dobeginPen.Mode:=AMode; case AlatkiZaCrtanje of     dtLinija: begin

MoveTo(TopLeft.X, TopLeft.Y);LineTo(BottomRight.X,BottomRight.Y);

end;dtPravoagolnik: beginRectangle(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y);

end;dtElipsa:   

Page 38: Vezba Paintce

beginEllipse(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y);

end;dtZaobPrav: 

beginRoundRect(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y,

(TopLeft.X‐BottomRight.X) div 2,(TopLeft.Y‐BottomRight.Y) div 2);end;end;  {end of case}end;     {end canvas do}end;

Page 39: Vezba Paintce

Секако треба да ги измените event handler‐ите, OnMoseUp, и OnMouseMove, за да ја повикате процедурата CrtajShape. Сега тие изгледаат:procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, Point(X,Y), pmCopy);CrtaSe:=False;end;

end;procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, KrajnaTocka, pmNotXor);KrajnaTocka:=Point(X,Y);Canvas.Pen.Mode:=pmCopy;CrtajShape(PocetnaTocka, KrajnaTocka, pmNotXor);

end;end;

Page 40: Vezba Paintce

Сега програмата Crtko црта само линии, треба да го оспособиме да црта и други облици, не само линии.Во секој од speed button‐ите креирајте OnClick настан кој има структура:procedure TfrmCrtko.btnLinijaClick(Sender: TObject);beginAlatkiZaCrtanje := dtLinija;end;

procedure TfrmCrtko.btnPravoagolnikClick(Sender: TObject);beginAlatkiZaCrtanje := dtPravoagolnik;end;

procedure TfrmCrtko.btnElipsaClick(Sender: TObject);beginAlatkiZaCrtanje := dtElipsa;

end;

procedure TfrmCrtko.btnZaobPravClick(Sender: TObject);beginAlatkiZaCrtanje := dtZaobPrav;

end;

Page 41: Vezba Paintce

чекор – Подесување на перо и четка

Графичката програма којa дозволува цртање црно‐бели слики не е интересна. За да користите повеќе бои треба да ги измените перото и четката кои canvas ги користи за цртање и боење. Но, пред тоа ќе додадеме два нови скриени tool bar‐ови.Tool bar‐овите не мораат да бидат видливи цело време. На располагање треба имате повеќе tool bar‐ови, но да се прикажат по желба на корисникот.

За да креирате скриен tool bar,

Додадете два paneli на формата.За двата панели сменете ја особината Align на alTop, и наместете ја особината Visible на False. Се разбира избришете им ги вредностите за особината Caption.

Иако tool bar‐овите остануваат видливи за време на креирање на програмата и можете да ги модифицирате, се скриени за време на извршување на програмата се додека апликацијата не ја смени нивната состојба.

На првиот tool bar од горе дајте му име CetkaBar, односно напишете во особината Name CetkaBar, а на другиот PenkaloBar.

Page 42: Vezba Paintce

Даден е изгледот на tool bar‐овите, а во табелите и имињата на speed button‐ите.

Освен тоа забележувате дека во овие tool  bar‐ови имаме и други контроли освен speed button‐и: лизгач, лабелa и colorgrid во случај PenkaloBar,  како иcolorgrid во случај на CetkaBar.

Page 43: Vezba Paintce

Додадете ги контролите на tool bar‐от да изгледа како на сл.Особината Name за контролите на tool bar‐от CetkaBar:

Позиција на speed button (од лево на десно) Name

1 SolidPen2 DashPen3 DotPen4 DashDotPen5 DashDotDotPen6 ClearPen7 PenColor8 PenWidth9 PenSize

Особината Name за контролите на tool bar‐от PenkaloBar:

Позиција на speed button (од лево на десно) Name

1 SolidBrush

2 ClearBrush

3 HorizontalBrush

4 VerticalBrush

5 FDiagonalBrush

6 BDiagonalBrush

7 CrossBrush

8 DiagCrossBrush

9 BrushColor

Page 44: Vezba Paintce

Во продолжение дадена е табела со сетирање особини за tool bar‐овите:Komponenta Osobina Vrednost 

SolidPen Glyph Solid.bmpDown True

DashPen Glyph Dashed.bmpDotPen Glyph Dotted.bmp

DashDotPen Glyph Dashdot.bmpDashDotDotPen Glyph dashdot2.bmp

ClearPen Glyph clear.bmpPenColor BackgroundEnabled False

GridOrdering go8x2Height 30Top 5Width 144

PenWidth LargeChange 10Top 12

FocusControl PenWidthCaption 1Top 13

SolidBrush Glyph Fsolid.bmpDown True

ClearBrush Glyph fclear.bmpHorizontalBrush Glyph fhorizontal.bmpVerticalBrush BrushGlyph fvert.bmpFDiagonalBrush Glyph fdiag.bmpBDiagonalBrush Glyph bdiag.bmpCrossBrush Glyph cross.bmp

DiagCrossBrush Glyph dcross.bmpBrushColor BackgroundEnabled False

GridOrdering go8x2Height 30Top 5Width 144

Page 45: Vezba Paintce

Криење и прикажување на tool bar‐овите

За да сокриете или прикажете tool bar за време на извршување на програмата, сетирајте ја особината Visible на False или True.Во нашата вежба за да ги сокриеме или прикажеме tool bar‐овите PenkaloBar и CetkaBar, ќе додадеме OnClick настан за копчето btnPenkalo и копчето btnCetkaБидејќи секој клик на едно од овие копчиња “го спушта” или “го крева” копчето, може да се додаде event handler OnClick кој ќе ги прикаже или сокрие соодветнитеtool bar‐ови, зависно дали копчето е горе или долу.Додадете го следниот код:procedure TfrmCrtko.btnPenkaloClick(Sender: TObject);beginPenkaloBar.Visible:=btnPenkalo.Down;end;

procedure TfrmCrtko.btnCetkaClick(Sender: TObject);beginCetkaBar.Visible:=btnCetka.Down;end;

Page 46: Vezba Paintce

Ако ја извршиме апликацијата, ќе забележите дека tool bar‐овите се појавуваат и кријат по потреба.Сега кога имаме tool bar‐ови за перото и четката во продолжение ќе биде појаснето нивното користење за работа со алатките за цртање.

Менување стил на перотоСтилот на перото одредува кој тип на линија се исцртува со перото, како полна, испрекината или точкеста или др. Односно стилот на перо е дефиниран во особината Style која може да има вредности: psSolid, psDash, psDashDot,psDashDotDot или psClear.

Доделување на event handler

Различните методи можат да користат ист event handler за да ги регулираат настаните, се додека настаните се компатибилни, значи го користат event handler‐от со исти параметри во ист редослед.

За да доделиме event handler, ќе доделиме ист event handler за настани на неколку контроли. Ако треба да се одреди која контрола го предизвикала настанот, ќе го користиме параметарот Sender.Во нашата апликација, ќе креираме event handler OnClick, за сите копчиња кои треба да направат промена на стил на перо и ќе користиме параметарот Sender за да одредиме кое копче е притиснато.

Page 47: Vezba Paintce

Ќе го направиме на следниот начин:Селектирајте ги сите 6 копчиња за стил на перо (со Shift) кои се наоѓаат на tool bar‐от PenkaloBarВо страницата Events во Object Inspector‐от, селектирајте OnClick.Во колоната Handler (во белиот edit box за OnClick) внесете SetiranjeStilPenkalo i притиснетеEnter. Delphi генерира празен клик handler по име SetiranjeStilPero i поврзувајќи го OnClickevent handler за сите 6 копчиња.Пополнете го event handler, сетирајќи го стилот на перото зависно од вредноста на  Sender:procedure TfrmCrtko.SetiranjeStilPenkalo(Sender: TObject);beginwith Canvas.Pen doif Sender=SolidPen thenStyle:=psSolid

elseif Sender=DashPen thenStyle:=psDash

elseif Sender=DotPen thenStyle:=psDot

elseif Sender=DashDotPen thenStyle:=psDashDot

elseif Sender=ClearPen thenStyle:=psClear;

end;

Page 48: Vezba Paintce

Промена боја на перо 

Бојата на перото ја одредува бојата на линијата која се црта со перото, вклучително линиите кои претставуваат граничници на цртаните облици како и др. линии.Во нашиот пример ќе користиме ColorGrid компонента на tool bar‐от PeroBar за корисникот избере нова боја за перото. ColorGrid може да сетира и боја за позадина и боја напред. Во нашиот случај, сакаме само една боја, ќе користиме боја напред.Значи за компонентата ColorGrid која ја нарековме PenColor креирајте настан OnClick со следен код:procedure TfrmCrtko.PenColorClick(Sender: TObject);beginCanvas.Pen.Color:=PenColor.ForegroundColor;end;

Page 49: Vezba Paintce

Промена на ширина на перо

Ширината на перото одредува дебелина во пиксели на линијата која ја цртаме. Запомнете кога дебелината е поголема од  1, некои видео драјвери секогаш покажуваат полни линии, без оглед која вредност е сетирана за особина Style.Во нашиот пр. ќе користиме лизгач на tool bar‐от перо за сетирање вредност за ширина на перото. Ќе ја смените лабелата покрај лизгачот за да имаме приказ на моменталната вредност на лизгачот. Напишете event handler за настан OnChangeна лизгачот PenWidth:procedure TfrmCrtko.PenWidthChange(Sender: TObject);beginCanvas.Pen.wIDTH:=PenWidth.Position;PenSize.Caption:=IntToStr(PenWidth.Position);end;

Page 50: Vezba Paintce

Менување стил на четкаСтилот на четката одредува која шара ја користи canvas за пополнување на обликот при цртање.Во примеров аналогно на создавање на event hedler за сетирање на стил на перо, да креираме event handler OnClick за 8‐те  копчиња speed buton. Селектирајте ги сите 8 копчиња за промена на стилот на четката и впишете SetiranjeStilCetka за event handler  OnClick.procedure TfrmCrtko.SetiranjeStilCetka(Sender: TObject);beginwith Canvas.Brush dobegin

if Sender=SolidBrush thenStyle:=bsSolid

elseif Sender=ClearBrush thenStyle:=bsClear

elseif Sender=HorizontalBrush thenStyle:=bsHorizontal

else

Page 51: Vezba Paintce

if Sender=VerticalBrush thenStyle:=bsVertical

elseif Sender=FDiagonalBrush thenStyle:=bsFDiagonal

elseif Sender=BDiagonalBrush thenStyle:=bsBDiagonal

elseif Sender=CrossBrush thenStyle:=bsCross

elseif Sender=DiagCrossBrush thenStyle:=bsDiagCross;

end;end;

Page 52: Vezba Paintce

Промена на боја на четка

Исто така креирајте аналоген код како и кај перото и за компонентата ColorGrid за промена на боја на четката BrushColor.

procedure TfrmCrtko.BrushColorClick(Sender: TObject);beginCanvas.Brush.Color:=BrushColor.ForegroundColor;end;

9. чекор – Додавање status bar

Status bar е сличен на tool bar, освен што обично го завзема дното на прозорецот наместо врвот и наместо да има контроли, status bar‐от обично прикажува текст. Delphi има посебна компонента StatusBar на картичката Win32, но ние сами ќе направиме status bar со помош на компонентата Panel. За да креирате status bar на формата направете:

Сместете компонента Panel на формата, сетирајте ја нејзината особина Align наalBottom,  a  пак  особината Caption избришете ја.

Page 53: Vezba Paintce

Делење на status bar

Често ќе сакаме да го поделиме панелот, посебно оној кој служи како status bar на повеќе независни подрачја. Тоа ќе го постигнеме на следниов начин:

Додадете уште еден Panel кој ќе го ставите на Panel кој пред малку го креиравте. Именувајте го PanPocetnaPozicija (Name),  сетирајте му ја особината Align на alLeft. Потоа додадете и десен Panel исто така ставете го на постоечкиот Panel, именувајте го PanMomentnaPozicija (Name) и сетирајте му ја особината Align на alClient.

Потоа и на едниот и на другиот Panel сетирајте ја особината BeveIlnner и BorderWidth на bvLowered и 2 респективно.Со тоа нашиот Status bar има 3d изглед.

Page 54: Vezba Paintce

Менување содржина на status barКога поставувате status bar на формата потребно е да менувате информации кои се наоѓаат наstatus bar‐от. Бидејќи имаме два панели содржината на PanPocetnaPozicija ќе рефлектира положба на почетна позиција на глувчето, а  PanMomentnaPozicija ќе рефлектира положба на моменталната положба на глувчето.Мораме да го промениме event handler OnMouseMove , OnMouseDown и OnMouseUp.procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:=True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);KrajnaTocka:=Point(X,Y);PanPocetnaPozicija.Caption:=Format('pocetna pozicija: (%d,%d)', [X,Y]);

end;procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, Point(X,Y), pmCopy);CrtaSe:=False;end;PanMomentnaPozicija.Caption:=Format('momentalna pozicija: (%d,%d)', [X,Y]);end;

Page 55: Vezba Paintce

10. чекор – Цртање на bitmapа

Многу ретко ќе цртаме директно на формата. Почесто, апликацијата ќе ја цртаме на  bitmapа, зошто bitmap‐ите се флексибилни за операции како копирање, печатење и зачувување. Delphi‐евата контрола Image е компонента која може во себе да има bitmapa, со што е олеснет начинот на сместување една или повеќе bitmap‐и на формата.Bitmapa‐та може да биде или помала или поголема од самата големина на формата. Додавајќи лизгач на формата и сместувајќи image контрола на неа, може да цртате на bitmap‐ите кои се доста поголеми од формата или поголеми од екранот.За креирање на скроловано подрачје, сместете ја scroll box компонентата ( Additional палета со компоненти) на формата и сетирајте ја особината Align на alClient, со што обезбедувате покриеност на целото подрачје на формата.

А за да креирате контрола за приказ на слика уфрлете на формата компонентаImage и сетирајте ја нејзината особина AutoSize на True и особината Left и Bottomна вредност 0.

Page 56: Vezba Paintce

Сетирање на почетните големини за bitmapаКога ставате image компонента, таа на себе нема слика. Креиравте подлога, но нема податок за тоа што прикажува. Ако подлогата чува една одредена слика, може да ја сетирате особината Picture контролата за време на креирање на формата. Компонентата може да вчита слика за време на извршување на програмата. Ако од друга страна ви е потребна празна контрола заради цртање, тогаш треба да ја креирате за време на извршување на програмата.За креирање на празна bitmapа кога стартува апликацијата,поврзете го event handler‐от за OnCreate настан на формата која има контрола, креирајте bitmap објект, и доделете  го на особината Picture на Graphic контрола image. Појасно ќе биде кога ќе го видиме кодот.Значи за формата која ја именувавме frmCrtko треба да креираме настан OnCreate и да го впишиме следниот код.

procedure TfrmCrtko.FormCreate(Sender: TObject);var Bitmap:TBitmap;beginBitMap:=TBitmap.Create;Bitmap.Width:=400;Bitmap.Height:=400;Image1.Picture.Graphic:=Bitmap;end;

Page 57: Vezba Paintce

Доделување на bitmap‐ата особина Graphic му дава на објектот слика со сопственост над bitmap‐ата. Од тие причини, кога ќе заврши работа со неа, ќе ја уништи, така да нема потреба вие тоа експлицитно да го работите.Ако сега ја стартуваме апликацијата ќе видиме дека клиент подрачјето на формата има еден бел дел кој претставува bitmap‐а. Ако се промени големината на формата како не би се видела целосно bitmap‐ата, автоматски се поставуваат соодветни лизгачи со кои може да се види целата bitmap‐а.Но ако се обидете да цртате по bitmap‐а, сеуште не сте во можност, зошто апликацијата црта по формата, која сега се наоѓа под подрачјето на лизгачот.За да цртате по bitmap‐а морате да користите canvas за image, а не canvas за form‐а.Најлесно е да извршите промени со еditor‐овото search‐and‐replace дијалог прозорец, со кое секое појавување “Canvas” ќе го замените со “Image.Canvas” за настаните на формата OnMouseDown, OnMouseMove, OnMouseUp и CrtajShape.Поврзете ги handler за настаните од страна на глувчето со одредени настани на контролата image.Во Object Inspector‐от, кликнете на листата покрај OnMouseDown за контролата image, односно компонента и селектирајте FormMouseDown, истото направете го и за OnMouseUp и OnMouseMove. Ако сакате можете да ги  “отфрлете” овие  handler‐и од формата, зошто не и се потребни, но и не морате, зошто формата заради контролите на неа, не е во состојба да прими настани врзани за глувчето на кои би можела да реагира.Сега кога ја извршувате апликацијата можете да цртате како и порано, но само на image контролата.

Page 58: Vezba Paintce

11. чекор – Додавање менија

За да ја комплетираме нашата апликација треба да работи и со менија, ако апликацијата е предвидена за работа со глувче.

За да додадеме мени за апликација, додадете невидлива компонента MainMenu(Standard) на формата.После тоа кликнете два пати на иконатаMainMeni да добиете Meni дијалог прозорец во кој ќе креирате опции и подопции на мени. Креирајте опции File и Edit, како и подопции прикажани во табелата:

&File &Edit

&Nova slika O&dseci

&Otvori  &Kopiraj

&Zacuvaj Z&alepi

Zacuvaj &kako

P&ecati

‐ (crta)

&Izlez

Page 59: Vezba Paintce

Сега кога имаме meni, пожелно е одма да креирате event handler за опција излез од менито File со чија помош се излегува од програмата. Едноставно ќе го поврзите веќе креираниот event handler OnClick за speed button btnIzlеz со настанот OnClick за подопцијата Izlеz.

На останатите опции на менито, во продолжение ќе придружите соодветниevent handler‐и.

Page 60: Vezba Paintce

Печатење графика

Печатење слика од Delphi е мошне едноставен процес. Единствено потребно е да додадете unit Printers во uses клаузулата на формата која ќе го повика печатачот. Unit Printers декларира објект Printer кој содржи canvas кој претставува печатена страница.На нашиот пример, ќе печатиме содржина на контролата image како одговор на клик на опцијата Печати на менито File. Креирајте OnClick настан за опцијата Печати.procedure TfrmCrtko.Pecati1Click(Sender: TObject);beginwith Printer dobeginBeginDoc;Canvas.Draw(0,0,Image1.Picture.Graphic);endDoc;end;

end;

Page 61: Vezba Paintce

12. чекор‐Работа со графички датотеки

Сликите кои постојат само за време на извршување на програмата се од помало значење. Пожелно е во програмата да имаме опции за отворање на веќе зачувани слики и опција за зачувување на сликата.Пред да ја направиме таа можност во програмата мораме да го направиме следното:

Додадете невидлива компонента OpenDialog и SaveDialog, одвишно е да зборуваме која за што служи.Ќе додадеме една јавна променлива под име TekovenFajl од тип String.

Page 62: Vezba Paintce

Вчитување слика од датотека

Способноста за вчитување слика од датотека е мошне важна ако апликацијата има потреба за модификација на сликата.За да вчитате слика во контролата image повикајте LoadFromFile метода на контролата image на објектот Picture. Додадете го следниот handler настан OnClickна опцијата Otvori на менито File.

procedure TfrmCrtko.Otvori1Click(Sender: TObject);beginif OpenDialog1.Execute thenbeginTekovenFajl:=OpenDialog1.FileName;Image1.Picture.LoadFromFile(TekovenFajl);end;

end;

Page 63: Vezba Paintce

Зачувување слика во датотека

Аналогно на отворање на fajl односно слика, креирајте handler за зачувување слика за опциите Zacuvaj I Zacuvaj kako од менито File, кои регулираат повторно зачувување, зачувување датотека која сеуште нема име и зачувување постоечка датотека под ново име.

procedure TfrmCrtko.Zacuvaj1Click(Sender: TObject);beginif TekovenFajl<>' '  thenImage1.Picture.SaveToFile(TekovenFajl)else Zacuvajkako1Click(Sender);

end;

procedure TfrmCrtko.Zacuvajkako1Click(Sender: TObject);beginif SaveDialog1.Execute thenbeginTekovenFajl:=SaveDialog1.FileName;Zacuvaj1Click(Sender);end;

end;

Page 64: Vezba Paintce

Замена на слики

Во Image контролата можете да замените слика во секој момент. Ако доделите нова слика, таа ја заменува постоечката на екранот.За да замените слика во image контролата, доделете нова слика во Picture објектот.Креирањето нова слика е ист процес како и креирањето иницијална слика, но треба да дадеме можност корисникот да одбере големина на слика која сака да ја креира. Најлесно е да се направи со помош на дијалог бокс како следниов:

Form‐ата именувајте ја frmBmpDlg ‐ особина Name, а во особината Captionнапишете Dimenzii na Bitmapa.На самата форма поставете две компоненти Label и во Caption поставете натпис Sirina i Visina респективно.На формата поставете две нови компоненти под име BitButton на кои респективно ќе ја сетираме особината Kind на bkOk и bkCancel.

Page 65: Vezba Paintce

Потребно е уште да ја поврземе главната форма со формата која врши промена на големината на нашата слика.Ќе го направиме така што за опцијата Nova Slika ќе додадеме event handler OnClickprocedure TfrmCrtko.Novaslika1Click(Sender: TObject);var Bitmap:TBitmap;beginwith frmBmpDlg dobeginActiveControl:=edit1;Edit1.Text:=IntToStr(Image1.Picture.Graphic.Width);Edit2.Text:=IntToStr(Image1.Picture.Graphic.Height);if ShowModal<>idCancel thenbeginBitmap:=TBitmap.Create;Bitmap.Width:=StrToInt(Edit1.Text);Bitmap.Height:=StrToInt(Edit2.Text);Image1.Picture.Graphic:=Bitmap;TekovenFajl:=' ';end;

end;end;

Page 66: Vezba Paintce

Важно е да се разбере да доделувањето на нова bitmap‐а на особината Graphic на picture објектот предизвикува бришење на постоечката bitmape и превземање сопствеништво над другата.13. чекор – Користење Clipboard со слики

Windows Clipboard може да се користи за копирање и префрлување слика во вашата апликација или за размена на слика со други апликации.

Пред да го користите објектот Clipboard во било која ваша апликација потребно е да додадетеunit ClipBrd во uses клаузулата на unit кој треба да има пристап до податоците од Clipboard. Копирање слика во Clipboard

Може да копирате слика, вклучувајќи содржина на image контролатаe, во Clipboard. Еднаш, кога ќе најде во Clipboard, сликата е достапна на сите Windows апликации.

За да копирате слика во Clipboard, доделете слика на објектот Clipboard со методата Assign.Значи формирајте OnClick настан за опцијата Kopiraj на менито Edit, и во него внесете го следниот код:

procedure TfrmCrtko.Kopiraj1Click(Sender: TObject);beginClipboard.Assign(Image1.Picture);end;

Page 67: Vezba Paintce

Преместување слика во Clipboard

Префрлувањето слика во Clipboard е исто како копирање, со тоа што сликата се бриши од изворот.За нашиот пример можете да го поврзете следниот event handler за OnClickнастанот на опцијата Odseci од менито Editprocedure TfrmCrtko.Odseci1Click(Sender: TObject);var Pravoagolnik:TRect;beginKopiraj1Click(Sender);with Image1.Canvas dobeginCopyMode:=cmWhiteness;Pravoagolnik:=Rect(0,0,Image1.Width,Image1.Height);CopyRect(Pravoagolnik,Image1.Canvas,Pravoagolnik);CopyMode:=cmSrcCopy;end;

end;

Page 68: Vezba Paintce

Префрлување слика од ClipboardАко Windows Clipboard содржи bitmap‐ска графика, може да ја префрлите во било кој image објект, вклучително image контрола, како и површината на формата.За да префрлиме слика од Clipboard, повикајте Clipboard метода HasFormat, за да проверите дали Clipboard содржи слика.HasFormat е Boolean функција. Враќа True ако Clipboard има содржина во релација со пренесените параметри. За да проверите дали Clipboard содржи слика, да го пренесеме параметарот CF_BITMAPКрерајте OnClick настан за опцијата Zalepi од менито Edit.procedure TfrmCrtko.Zalepi1Click(Sender: TObject);var Bitmap:TBitmap;beginif Clipboard.HasFormat(CF_BITMAP) thenbeginBitmap:=TBitmap.Create;tryBitmap.Assign(Clipboard);Image1.Canvas.Draw(0,0,Bitmap);finallyBitmap.Free;end;    end;

end;и со тоа ја завршивме нашата апликација Crtko.

Page 69: Vezba Paintce

Вклучување фонтови во апликацијата (односно *.exe)1. ЧекорПрво треба да креираме т.н. rc датотека односно датотека соекстензија rc. Ја креираме во кој било текст едитор, пр. во notepad исекако треба да ја зачуваме со наставка rc.Датотеката содржи опис на фонтови кои се користат во апликацијата.Би изгледало вака:

MY_FONT ANYOL1 "Bauhs93.ttf"MY_FONT ANYOL2 "Bauhs94.ttf"итн...

2. ЧекорСега треба да креираме т.н. ресурс датотека со наставка *.res. и тоа на следниот начин:Одиме во DOS prompt:и пишуваме BRCC32 MyFont, Така креираме датотекаMyFont.res.

Page 70: Vezba Paintce

3. ЧекорСега треба во апликацијата да ја вклучиме датотеката res со фонтовите.Во unit под implementation 

{$R *.DFM} треба да внесеме {$R MyFont.res}Овозможивме користење на фонтови во апликацијата.4. ЧекорЗа настанот OnCreate на самата форма го пишуваме следниот код:procedure TForm1.FormCreate(Sender: TObject);varRes : TResourceStream;beginRes := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));Res.SavetoFile('Bauhs93.ttf');Res.Free;AddFontResource(PChar('Bauhas93.ttf'));SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);end;

Page 71: Vezba Paintce

5. ЧекорСега сите фонтови од res датотеката се достапни и може да гикористиме, пр. фонтот “Bauhaus 93” преку следниот код:

procedure TForm1.Button1Click(Sender: TObject);begin

Button1.Font.Name := 'Bauhaus 93';end;