9. diel - Bitmapy a vlastné maľovanie
Vitajte u ďalšej časti návodu. Budeme pokračovať v kreslení. Začnime uľahčením, ktoré určite pri kreslení využijete:
WITH!
with Canvas do
begin
end;
Spôsobí to, že môžete písať položky plátna ako napr. Canvas.Pen ale ako obyčajné Pen. Rovnako ako pri okne. Nepíšete Form1.Width, ale stačí Width. Rovnako tak môžete využiť with. Ešte jeden príklad:
with PaintBox1.Canvas do begin Rectangle(0, 0, 150, 200); Pen.Color := Panel1.Color; Ellipse(1,1,149,199); end;
Na úvod si ešte povedzme, ako môžeme napísať text bez pomoci labelu. Samozrejme iba na Canvas. Použijeme príkaz:
TextOut(X, Y, Napis);
Kde X bude umiestnenie zľava a Y odhora. Napis bude akýkoľvek string, ktorý chceme vypísať. Pr .:
Canvas.TextOut(100, 150, '<- Zde je pozice 100x150!');
A bude! OK, postupov ďalej!
Chcem vás naučiť kresliť na Canvas bitmapy (súbory s koncovkou BMP) ak tomu potrebujete poznať nový typ premennej:
TBitmap
Čo dokáže ?: Skoro nič, ale je potreba. Vie hlavne vytvoriť v pamäti miesto na obrázok a to miesto nejakým obrázkom z disku zaplniť. K vytvoreniu miesta slúži tento príkaz:
Obrazek := TBitmap.Create;
Obrazok je premenná typu TBitmap. A teraz potrebujeme do miesta pre bitmapu nazvaného Obrazek nejakú tú BMP načítať! Ako? klasicky:
Obrazek.LoadFromFile(Adresa);
A za Adresa dosadíte adresu nejakého súboru s koncovkou BMP. Pr .:
Obrazek := TBitmap.Create;
Obrazek.LoadFromFile('C:\Obrázky\KukíkPoNičení.bmp');
A je to! Potom, čo TBitmap použijete a viete, že už ju používať nebudete, mali by ste uvoľniť miesto v operačnej pamäti tým, že TBitmap premennú zrušíte:
Obrazek.Destroy;
Nakoniec ešte dve zaujímavosti. TBitmap má Canvas (rovnakú ako Picture -
nemožno ju prekresliť tak, že by sa zmazal jej obsah), takže si na nej
môžete pokojne kresliť!
A za druhé: Môžete si zvoliť priehľadnú farbu (rovnako ako u okna).
Položkou Transparent nastavíte, či TBitmap bude, alebo nebude môcť mať
priehľadnú časť a položkou TransparentColor nastavíte, ktorá farba bude
priehľadná.
Pr .:
Obrazek.Transparent := True; Obrazek.TransparentColor := clWhite;
A to je k premennej TBitmap asi všetko! Alebo nie?
POZOR! ZAUJÍMAVOSŤ!
Chcete si vytvoriť súbor BMP? Ide to! Nastavíte veľkosť obrázkov (typu
TBitmap) a kreslíte si na neho. Ako určiť veľkosť? Pomocou položiek Width
a Height. A ako potom uložiť do súboru? pomocou príkazu
SaveToFile(Adresa);
Pr .:
Obrazek.Width := 100; Obrazek.Height := 150; Obrazek.SaveToFile('%USERPROFILE%\Desktop\HokusPokus.bmp');
A obsah obrázky sa vám uloží na plochu,% userprofile% je skratka WIndows, ktorá vedie do zložky aktuálneho používateľa a desktop vedie podľa názvu na plochu. HokusPokus.bmp! ukladajte
Dialógy pre prácu s obrázkami
K načítanie obrázkov sa môže hodiť okno na otváranie obrázkov. To nájdete v časti horného menu nazvanej dialogs. Tretí zľava .:
OpenPictureDialog
Sklamem vás, ale všetko je rovnaké, ako u OpenDialogu. Jediný rozdiel je ten, že u dialógu obrázkov máte nastavené Filtre pre obrázky, ktoré Delphi zvláda. Tie si samozrejme ale môžete upraviť.
A pre ukladanie slúži dialógové okno napravo od OpenPictureDialogu nazvanej:
SavePictureDialog
- Rovnako ako u OpenPictureDialogu je aj tu zmena iba v náhľade na obrázok a Filtrov pre obrázky.
Keď už sme pri objektoch, povedzme si o jednom, ktorý vám určite vylepší program (môžete si napríklad ozvučiť rôzne akcie). Zájdite do Additional a tam nájdete:
ApplicationEvent
- Proste skvelá vecička! Čo keď sa maximalizuje okno? To by ste chceli treba zmeniť rozmery nejakých objektov, nie? Áno, ide použiť procedúra OnResize, ktorú má samotné okno, ale to je len jedna z výhod, ktoré vám dovoľuje ApplicationEvent. No, posúďte sami, pri akých podujatiach s oknom môžete naprogramovať, čo sa má stať:
- OnActivate - POZOR! Nie je to to isté, čo má okno toto sa spustí VŽDY, keď sa okno zaktivuje (má modrý vrch-je aktívny), zatiaľ čo pri okne len prvýkrát!
- OnDeactivate - Keď zo okno deaktivuje (má sivý vrch-je neaktívny)
- OnException - Pri výnimke (Čo sa napríklad stane, keď delíte nulou)
- OnHelp - Pri požiadaní o Help
- OnHint - Akonáhle ukážete myšou na objekt, ktorý má nadefinovanú položku Hint
- OnIdle - Keď je program nečinný (zrovna nič nevypisuje, alebo nepočíta)
- OnMessage - Pri vypísaní nejaké správy (výstražné, informačné atď.)
- OnMinimize - Akonáhle sa minimalizuje okno
- OnRestore - Keď sa okno vráti z minimalizácie
- OnShowHint - Keď sa zobrazí pomocný text (Hint)
PSK OnShowHint - vnútri procedúry môžete využiť miestnu premennú HintStr, ktorá obsahuje text, ktorý sa zobrazuje.
Vráťme sa späť k plátnu ... Minule sme preberali čiaru. Ale ako urobiť bod alebo krivku? Aj z čiary! Všetko sa musí rozpočítať na hŕbu malých čáreček (napríklad jednopixelových (pixel je jeden bod na obrazovke, ale to už snáď viete ). Aby ste videli, že to tak naozaj funguje, uvediem príklad kriviek (a bude záležať len na vás, ako budú krivky krivé), kde nie je potrebné nič počítať:
Takže najprv pomenujte okno! Bude to tak lepšie! Trebárs Okno! Teraz nájdite procedúru OnMouseDown, do ktorej píšte:
Canvas.LineTo(X, Y);
if ssRight in Shift then
Invalidate;
Tu vidíte krásny príklad využitia premenných procedúry OnMouseDown! Najprv sa nakreslí čiara na miesto, kde stlačíte tlačidlo myši a ak stlačíte pravé, všetko sa následne prekreslí (a pretože nie je nič v procedúre OnPaint, všetko sa zmaže). Teraz vám program robí čiary medzi bodom, kde ste klikli naposledy a kam ste klikli teraz! Tým vám ale kreslenie kriviek nepredvedie. Názornejšie bude naviac použiť procedúru OnMouseMove, kde napíšete:
if ssLeft in Shift then
Canvas.LineTo(X, Y);
A teraz môžete trénovať kreslenie obrázkov raz čiarou. A čo keď chcete dvíhať pero? V procedúre OnMouseDown zmeňte Linette na MOVETO a to je celá zmena! Ale čo keď chcete urobiť len bodku? OK, napíšte do procedúry OnMouseDown ešte:
Canvas.MoveTo(X, Y+1);
Ale medzi prvé dva riadky! NIE NA KONIEC! A ak nenapíšete + alebo -1 za X
alebo Y, nič sa nenakreslí!
A ešte: Ak sa vám nepáči tenučká čiara, ktorú píšete, do rocedury
OnCreate vložte:
Canvas.Pen.Width := 5;
A alebo ešte lepšie: Vložte TrackBar a pomenujte ho Sire. Nájdite v ňom procedúru OnChange a píšte:
Canvas.Pen.Width := Sire.Position;
Teraz si už môžete nastavovať šírku podľa rozsahu TrackBaru!
A konečne môžeme kresliť bitmapy na plátno. Je na to príkaz: DRAW, Napíšete:
Canvas.Draw(Zleva, shora, bitmapa);
Zľava bude rozmer X, kam sa nakreslí obrázok (akýkoľvek Integer), zhora je rozmer Y (tiež Integer) a bitmapa je obrázok, ktorý sa bude kresliť (TBitmap). Môžete však tiež zakresľovať najskôr na nejakú TBitmap a jej potom vložiť na plátno. A ako vždy vám teraz ukážem príklad:
Najprv vytvoríme premenné:
Obr : TBitmap; Ykz, Ypz : Integer;
Premenujeme Form1 na Okno, farbu pozadia (Color) na clWhite a následne iba vyplníme procedúry. Najprv OnCreate:
Obr := TBitmap.Create; Obr.Width := Okno.Width; Obr.Height := Okno.Height;
Vytvorili sme teda Obr typu Tbitmap, ktorý má rozmery Okná. Teraz procedúru OnMouseDown:
Ykz := X; Ypz := Y;
Tým určíme rozmery pre začiatok kreslenie. A teraz OnMouseMove:
if ssLeft in Shift then begin Canvas.Draw(0,0,Obr); Canvas.Ellipse(Ykz,Ypz,X,Y); end;
Čiže ak je pri pohybe stlačené ľavé tlačidlo myši, nakresli najprv pozadia (TBitmap Obr, ktorá obsahuje predchádzajúce pozadie) a potom cez pozadie nakresli od Ykz, YPZ po pozíciu myši elipsu. A teraz záverečnú (dôležitú procedúru OnMouseUp:
Obr.Canvas.Ellipse(Ykz, Ypz, X, Y);
Akonáhle pustíte myš, nakreslí sa elipsa do TBitmap (jednoducho pomyselný obrázok) a tým sa vlastne uloží to operačnej pamäte. A vy môžete kresliť ďalšie cez túto. Tým máme základ a zostáva len dorobiť dve drobnôstky. Čo keď zmeníme rozmer okna? Vyplníme preto procedúru OnResize:
if Obr.Width < Okno.Width then Obr.Width := Okno.Width; if Obr.Height < Okno.Height then Obr.Height := Okno.Height;
Ak okno zväčšujeme cez rozmery TBitmap Obr, zmení sa aj jej rozmery. Ak, nie, tak sa nezmení (a to chceme! - keby ste okno zväčšili, kreslili na neho, zmenšili a následne zase zväčšili, orezanie by sa okraje pôvodného obrázku!). A ešte musíme počítať s tým, že sa okno niekedy prekresľuje. A k tomu máme procedúru OnPaint, do ktorej dáme akurát:
Canvas.Draw(0,0,Obr);
A máme program, kde sa kreslí biele elipsy na biele pozadie! Dúfam, že vám taký príklad stačí!
Uznávam, že tento návod je celkom napchatý príklady, ale je to najlepší spôsob, ako niečo vysvetliť! K ďalším prácam potrebujete ale poznať ďalší typ premennej a to: TRect
Klasicky sa spýtam čo vie? A opäť štandardne odpoviem nič, ale hodí sa. K čomu? Rect je skratka pre Rectangle a ak sa učíte angličtinu, alebo máte dobrú pamäť, tak Rectangle je anglicky obdĺžnik. A čo je toto za obdĺžnik? Opäť pomyselný (neviditeľný). Udáva nám iba rozmery akéhosi obělníku na ploche. Premenné typu TRect majú tieto podproměnné (integer):
- Left - súradnice X (počet pixelov zľava) počiatočného bodu
- Right - súradnice X cieľového bodu
- Top - súradnice Y (počet pixelov odhora) počiatočného bodu
- Bottom - súradnice Y cieľového bodu
A alebo môžete použiť zvyšné dve premenné typu TPoint
- Topleft - súradnice začiatočného bodu
- BottomRight - súradnice cieľového bodu
Vy ale nepoznáte typ premennej: TPoint
Ten už je vôbec jednoduchý. Má iba dve súradnice nejakého miesta:
- X - zľava (Integer)
- Y - zhora (Integer)
A to je tentokrát z typov premenných všetko! Teraz vám poviem ďalší príkaz Canvas,, ktorý sa hodí. A to: PIXELS
Určí vám farbu, ktorá je na Canvas, v určitom mieste. Využitie: Pixels [Zľava, Zhora]; Namiesto Zľava zadáte rozmer X a miesto Zhora rozmer Y. Pr .:
Panel1.Color := Canvas.Pixels[150, 486];
Ale teraz sa vráťme k TRect! Prečo som vám o ňom vôbec hovoril, že? Z jedného dôležitého dôvodu! V Canvas, je totiž potrebné neustále! Tvorcovia Delphi si tým znížili počet údajov v zátvorkách (no uznajte! Napr RoundRect má 6 údajov. To je o nervy! : D ) A tak pre niekoho programovanie predĺžili, ale pre nejaké prípady zase skrátili! Mno, jednoducho vám teraz môžem povedať Daley príkazy, kde je použitý TRect: Ellipse Áno, možno sa čudujete, ale Ellipse má 2 alternatívy. Jednu so štyrmi rozmery v zátvorke a druhú s TRectem v zátvorke.
Pr .:
Canvas.Ellipse(Ctverec);
rectangle
Áno, rovnako tak i Rextangle má 2 alternatívy.
Canvas.Rectangle(Ctverec);
Príkazov s TRect je veľa a tak vám tentoraz napíšem tri. A ten posledný je nový: CopyRect.
Skopíruje obdĺžnikovú časť z nejakého Canvas, a vloží do toho, v ktorom príkaz vyvoláme. Vzor písania:
CilovaCanvas.CopyRect(CilovyTRect, ZdrojovaCanvas, ZdrojovyTRect);
CilovyTRect bude TRect, podľa ktorého sa určí miesto, kam sa do CilovaCanvas nakreslí to, čo sa v miestach, ktoré určuje ZdrojovyTRect (tiež typu TRect), zo ZdrojovaCanvas vyreže. Pr .:
Bitmapa.Canvas.CopyRect(Ctverec1, Canvas, Ctverec2);
A ak chcete využiť TPoint, môžete miesto MOVETO (X, Y); používať PenPos (Misto) ;, kde Misto bude TPoint!
A teraz si dovolím niečo, čo som ešte nikdy v týchto návodoch neurobil a to že s vami vyrobím kvalitný program. Ale nedoděláme ho dnes, ale až inokedy. Dneska na to totiž máme len 3 body a to bude zatiaľ stačiť ... Dôležité pre vás asi bude, aké sú objekty a aké procedúry. Pre istotu si môžete zdrojový kód programu dole pod článkom. Keď už sme pri prenášaní zdrojových kódov Delphi, mal by som vám povedať, aké súbory musíte skopírovať: Dvaja sa menom Projektu a dvaja s menom každého okna. Tie sa menom projektu musí mať príponu DPR a RES. A súbory okien musí mať PAS a DFM. Čo ktoré obsahujú? DPR obsahuje postup otvárania okien a pod. V RES sú uložené napr. Ikony. PAS obsahuje ten text, čo vidíte v okne na písanie programu a DFM informácie o objektoch (obsah Object Inspector). A teraz pokročme. Najprv vám poviem nadradenosť objektov (vždy napíšem najprv názov typu objektu a do zátvorky jeho meno):
Do okna (pomenujte ho Okno!) Vložte kamkoľvek: OpenPicturDialog (Open), SavePictureDialog (Save), ColorDialog (VyberBarvu), PaintBox (plocha) a dva Panely (VyberBarvyAStylu a VyberNastroje).
Začnime vkladaním vecí do panelu VyberBarvyAStylu (opäť vložte kamkoľvek-neskôr pozície nastavíte!): Panel (BgBarva), 2xCheckBox (Obrys a Vyplnený), TrackBar (Sirka) a 3xLabel (pozícia, SirVys, Veľkosť). Do panelu BgBarva ešte vložte Panel, pomenujte FwBarva a môžeme postúpiť k vkladanie objektov do panelu VyberNastroje: 2x Button (otvoriť, uložiť,) a 5xRadioButton (Cary, Elipsy, Línia, obdĺžniky, Rozmer). A teraz sa pripravte na šialenú tabuľku:
name | caption | Left | top | align | width | height | checked | Color | BevelOuter |
okno | kreslenie | ? | ? | alNone | ? | ? | X | clGray | X |
plocha | X | 66 | 10 | alNone | 320 | 240 | X | clWhite | X |
VyberBarvu | X | X | X | X | X | X | X | clBlack | X |
VyberBarvyAStylu | 0 | 267 | alBottom | auto | 50 | X | clBtnFace | bvRaised | |
BgBarva | 8 | 5 | alNone | 40 | 40 | X | clBlack | bvLowered | |
FwBarva | 8 | 8 | alNone | 24 | 24 | X | clWhite | bvNone | |
obrys | obrys | 136 | 8 | X | 49 | 17 | true | clBtnFace | X |
Pozícia | X, Y | 255 | 24 | alNone | 20 | 13 | X | clBtnFace | X |
sirka | X | 64 | 8 | alNone | 73 | 33 | X | X | X |
SirVys | š., v. | 255 | 8 | alNone | 23 | 13 | X | clBtnFace | X |
veľkosť | 320x240 | 327 | 16 | alNone | 47 | 13 | X | clBtnFace | X |
vyplni | výplň | 136 | 24 | X | 49 | 17 | true | clBtnFace | X |
VyberNastroje | 0 | 0 | alLeft | 56 | auto | X | clBtnFace | bvRaised | |
Cary | ceruzka | 3 | 51 | X | 49 | 17 | false | clBtnFace | X |
elipsy | elipsy | 3 | 3 | X | 49 | 17 | false | clBtnFace | X |
línia | linky | 3 | 35 | X | 49 | 17 | false | clBtnFace | X |
obdĺžnikov | Obdĺž. | 3 | 19 | X | 49 | 17 | false | clBtnFace | X |
otvoriť | otvoriť | 4 | 96 | X | 48 | 20 | X | X | X |
Rozmer | X, Y | 6 | 165 | X | 46 | 17 | true | clBtnFace | X |
Ulozit | Uložiť | 4 | 120 | X | 48 | 20 | X | X | X |
To bohužiaľ nie je všetko. Ešte nastavte u fontu rozmer tučné písmo (Bold), u FwBarva a BgBarva nastavte ShowHint na True a Hint na Obrys (BgBarva) a Výplň (FwBarva). Ešte som vám nehovoril o položke (premenné) okná, ktorá je:
ActiveControl - Zvolíte objekt, ktorý bude po spustení aktívne (bude mať okolo seba rámček, ako keby to bolo posledné, na čo ste klikli!). A my si ako ActiveControl zvolíme Rozmer! A teraz k samotnému textu programu (čo čo robí budete musieť vyčítať z poznámok v {}:
public { Public declarations } Obraz : TBitmap; Iks, Yps : Integer; end; var Okno: TOkno; implementation {$R *.dfm} procedure TOkno.PlochaMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin {Zazanamenání pozice kurzoru:} Pozice.Caption := IntToStr(X) + ', ' + IntToStr(Y); {Šířka obrázku:} if ssLeft in Shift then SirVys.Caption := IntToStr(X - Iks) + ', ' + IntToStr(Y - Yps); {Kreslení elipsy:} if (Elipsy.Checked) and (ssLeft in Shift) then begin Plocha.Canvas.Draw(0,0,Obraz); Plocha.Canvas.Ellipse(Iks, Yps, X, Y); end; {Kreslení obdélníku:} if (Obdelniky.Checked) and (ssLeft in Shift) then begin Plocha.Canvas.Draw(0,0,Obraz); Plocha.Canvas.Rectangle(Iks, Yps, X, Y); end; {Kreslení linie:} if (Linie.Checked) and (ssLeft in Shift) then begin Plocha.Canvas.Draw(0,0,Obraz); Plocha.Canvas.MoveTo(Iks, Yps); Plocha.Canvas.LineTo(X, Y); end; {Kreslení čar:} if (Cary.Checked) and (ssLeft in Shift) then Plocha.Canvas.LineTo(X, Y); end; procedure TOkno.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin {Zazanamenání pozice kurzoru:} Pozice.Caption := '(' + IntToStr(X - 66) + ', ' + IntToStr(Y - 10) + ')'; end; procedure TOkno.FormCreate(Sender: TObject); begin {Nastavení TBitmap Obraz:} Obraz := TBitmap.Create; Obraz.Width := 320; Obraz.Height := 240; end; procedure TOkno.PlochaPaint(Sender: TObject); begin {Nakreslení při překreslení :-)} Plocha.Canvas.Draw(0,0,Obraz); end; procedure TOkno.PlochaMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {Zapamatování souřadnic:} Iks := X; Yps := Y; Plocha.Canvas.MoveTo(X,Y); {Šířka a výška je 0:} SirVys.Caption := '0, 0'; {Změna rozměru papíru:} if (Rozmer.Checked) and (ssDouble in Shift) and (X*Y > 0) then begin Plocha.Width := X; Plocha.Height := Y; Obraz.Width := X; Obraz.Height := Y; Velikost.Caption := IntToStr(X) + ' x ' + IntToStr(Y); end; end; procedure TOkno.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {Změna rozměru papíru:} if (Rozmer.Checked) and (ssDouble in Shift) and (X > 66) and (Y > 10) then begin Plocha.Width := X-66; Plocha.Height := Y-10; Obraz.Width := X-66; Obraz.Height := Y-10; Velikost.Caption := IntToStr(X-66) + ' x ' + IntToStr(Y-10); end; end; procedure TOkno.OtevritClick(Sender: TObject); begin {Otevření obrázku} if Open.Execute then Obraz.LoadFromFile(Open.FileName); Plocha.Width := Obraz.Width; Plocha.Height := Obraz.Height; Plocha.Canvas.Draw(0,0,Obraz); Velikost.Caption := IntToStr(Obraz.Width) + ' x ' + IntToStr(Obraz.Height); end; procedure TOkno.PlochaMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Celek : TRect; begin {Zrušení šířky a výšky:} SirVys.Caption := 'š., v.'; {Nakreslení ťupky:} if (X = Iks) and (Y = Yps) and (Rozmer.Checked = False) and (Obrys.Checked = False) then Plocha.Canvas.LineTo(X + 1,Y); {Nakreslení elipsy:} if Elipsy.Checked then Obraz.Canvas.Ellipse(Iks, Yps, X, Y); {Nakreslení obdélníku:} if Obdelniky.Checked then Obraz.Canvas.Rectangle(Iks, Yps, X, Y); {Nakreslení linie:} if Linie.Checked then begin Obraz.Canvas.MoveTo(Iks, Yps); Obraz.Canvas.LineTo(X, Y); end; {Nakreslení čar:} Celek.Left := 0; Celek.Top := 0; Celek.Right := Plocha.Width; Celek.Bottom := Plocha.Height; if Cary.Checked then Obraz.Canvas.CopyRect(Celek, Plocha.Canvas, Celek); end; procedure TOkno.UlozitClick(Sender: TObject); begin {Uložení obrázku} if Save.Execute then Obraz.SaveToFile(Save.FileName); end; procedure TOkno.FwBarvaDblClick(Sender: TObject); begin {Výběr barvy výplně:} if VyberBarvu.Execute then begin FwBarva.Color := VyberBarvu.Color; Plocha.Canvas.Brush.Color := FwBarva.Color; Obraz.Canvas.Brush.Color := FwBarva.Color; end; end; procedure TOkno.BgBarvaDblClick(Sender: TObject); begin {Výběr barvy obrysu:} if VyberBarvu.Execute then begin BgBarva.Color := VyberBarvu.Color; Plocha.Canvas.Pen.Color := BgBarva.Color; Obraz.Canvas.Pen.Color := BgBarva.Color; end; end; procedure TOkno.SirkaChange(Sender: TObject); begin {Nastavení šířky pera:} Plocha.Canvas.Pen.Width := Sirka.Position; Obraz.Canvas.Pen.Width := Sirka.Position; end; procedure TOkno.ObrysClick(Sender: TObject); begin {Nastavení viditelnosti obrysu:} if Obrys.Checked then begin Plocha.Canvas.Pen.Style := psSolid; Obraz.Canvas.Pen.Style := psSolid; end else begin Plocha.Canvas.Pen.Style := psClear; Obraz.Canvas.Pen.Style := psClear; end; end; procedure TOkno.VyplnClick(Sender: TObject); begin {Nastavení viditelnosti výplně:} if Vypln.Checked then begin Plocha.Canvas.Brush.Style := bsSolid; Obraz.Canvas.Brush.Style := bsSolid; end else begin Plocha.Canvas.Brush.Style := bsClear; Obraz.Canvas.Brush.Style := bsClear; end; end; end.
A môžete kresliť elipsy, obdĺžniky, úsečky a čiary. Tiež môžete meniť farbu výplne a obrysu, šírku a viditeľnosť obrysu, transparentnosť výplne a veľkosť kresliace plochy. Nabudúce ten program ešte zdokonalíte ...
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 498x (394.7 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Delphi