Začínáme s DelphiX - 2. díl
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Začínáme s DelphiX - 2. dílZačínáme s DelphiX - 2. díl

 

Začínáme s DelphiX - 2. díl

Google       Google       11. 11. 2005       9 481×

Tentokrát si v seriálu procvičíme dvě zajímavé metody vykreslování - StretchDraw a DrawAlpha.

Reklama
Reklama

Vykreslování v DelphiX

Díl druhý – Roztažení do obdélníku a kreslení s průhledností

Po zdlouhavém prvním dílu se dáme rovnou na věc a ukážeme si další dvě užitečné metody vykreslování. Tentokrát to bude StretchDraw, který nám přizpůsobí obrázek čtverci, resp. obdélníku, jaký si definujeme a kreslení s Alpha průhledností. Tak hurá do toho a půl je hotovo.

Roztažení do obdélníku
Toto je velmi užitečná věc, pokud chcete například zobrazit pulzující srdíčko signalizující život v nějaké plošinovce, apod. Zkrátka a jednoduše můžete mít libovolně veliký obrázek a ten průběžně zvětšovat či zmenšovat podle Vašich potřeb (i když, s tím zvětšováním opatrně, lepší je mít obrázek v největší variantě a pouze ho zmenšovat, tak se vyhnete nepříjemnému rozmazání). Rozeberme si tedy příkaz:

TDXImageList.Items[x].StretchDraw (plocha, obdélník, část obrázku);

plocha: To už známe, o čem jsem už mluvil, budu nyní vypouštět.
obdélník: Sem si dosadíme název obdélníku, do kterého budeme kreslit. My si ho pojmenujeme „obdelnik“.

Náš příkaz tedy vypadá takto:


dximagelist1.Items.find('DelphiX').StretchDraw(dxdraw1.surface, obdelnik, 0); // v případě, že chceme vykreslit obrázek s názvem „DelphiX“ do obdélníku „obdelnik“

resp. takto (druhou variantu budu pro příště také vynechávat - myslím, že je to jasné):


dximagelist1.Items[0].StretchDraw(dxdraw1.surface, obdelnik, 0);

Zkuste si program zkompilovat; pravděpodobně Vám bude hlásit, že „obdelnik“ je nesmysl. To není divu, protože jsme žádný nevytvořili. Tak to změníme. Definujte si tedy globální proměnnou obdelnik, která bude typu TRect (pro ty, co v Delphi neumí vůbec nic: uděláte to příkazem „obdelnik: Trect;“ - bez uvozovek - který vložíme před příkaz „implementation,“ za příkaz „var“, který určuje definici proměnných) a programově si určíme rozměry obdélníku hned na spuštění programu (tyto hodnoty se týkají mého obrázku, vy si je přizpůsobte):


procedure TForm1.FormCreate(Sender: TObject);
begin
	obdelnik.Left:=10; // určí vzdálenost levého okraje obdélníku od levého okraje dxdraw
	obdelnik.Top:=10; // určí vzdálenost horní strany
	obdelnik.Right:=212; // vzdálenost pravého okraje obdélníku od levého okraje dxdraw (nikoli od levého okraje obdélníku, na to pozor!)
	obdelnik.Bottom:=94; // vzdálenost spodní strany (platí totéž jako u „obdelnik.Right“)
end;

A pustíme se do kreslení. Zkusíme si rovnou něco, kde se projeví funkčnost příkazu. Obrázek se bude roztahovat na polohu myši tím, že se pravý dolní roh přizpůsobí poloze myši. Opět použiji „-form1.left“ a „-form1.top,“ abych ošetřil vzdálenost okna od okrajů plochy. Ovšem pozor! Zatímco zvětšovat obrázek si můžete do aleluja, se zmenšováním to není tak jednoduché, když to přeženete, začnou se objevovat nesmysly (to je vidět i v mém příkladu). Tomu se dá předejít pomocí vypočítávání obrázku a ukládání do DIBu, ale to je záležitost pro můj seriál příliš komplikovaná a nemá s příkazem StretchDraw vůbec nic společného, takže nevidím důvod, proč to sem psát. Nejjednodušší je zkoušet si, kam až je možno zajít, metodou pokusu a omylu. Ale tady už je finální procedura onTimer:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.fill(0);
	obdelnik.Right:=mouse.cursorpos.x-form1.left; // spočítá vzdálenost pravé strany s přihlédnutím k poloze okna
	obdelnik.Bottom:=mouse.cursorpos.y-form1.top; // spočítá vzdálenost spodní strany s přihlédnutím k poloze okna
	dximagelist1.Items.find('DelphiX').StretchDraw(dxdraw1.surface, obdelnik, 0); // vykreslí na obdélník obrázek
dxdraw1.flip;
end;

Tentokrát si už program zaslouží zdrojový kód ke stažení (v Delphi 5).
Jinak, zkuste si za domácí úkol zkusit to výše zmiňované pulzující srdíčko. Věřím, že to nebude pro většinu z Vás problém.

- A tady jsou obrázky


obr. 1, 2: obrázek přizpůsobený obdélníku


obr. 3, 4: takhle to může vypadat, když to přeženete se zmenšováním do některého ze směrů

- Kreslení s průhledností
Tak tohle bude o něco stručnější, neboť problematiku s obdélníkem již umíme (roztažení do obdélníku je vlastnost skoro všech vykreslovacích metod). Aby si někteří z Vás doplnili mezeru ve vzdělání, můžu Vám prozradit, že průhlednosti, se kterou budeme pracovat, se říká Alpha [alfa] průhlednost. Ten příkaz se podle toho také jmenuje, takže je dobré si to pamatovat. Praktické využití si doufám dovedete představit, takže jdu rovnou na věc. Tady je příkaz (nezapomeňte si vytvořit obdélník):

TDXImageList.Items[x].DrawAlpha(plocha, obdélník, část obrázku, index průhlednosti);

index průhlednosti: Sem si dosadíme číslíčko od 0 do 255 (resp. proměnnou, která toto číslo obsahuje), které nám určí, jak moc bude obrázek průhledný (0-neviditelný, 255-neprůhledný).

A teď konkrétně:


dximagelist1.Items.find('DelphiX').DrawAlpha(dxdraw1.surface, obdelnik, 0, 125); // průhlednost bude přibližně poloviční

Myslím, že k tomu není co dodat. Ukážeme si příklad, kde se pomalu zjeví obrázek. Nejprve si vytvořte proměnnou typu Integer jménem „alpha“, která bude určovat aktuální průhlednost. A nezapomeňte jí na onCreate formuláře nastavit hodnotu nula. Není to nutné (Delphi nastavují automaticky nulovou hodnotu), ale je to profesionálnější přístup. A tady je obsah procedury onTimer:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.fill(0);
	if alpha<255 then inc(alpha); // navýší hodnotu proměnné alpha při každém průběhu procedury, pokud ovšem není její hodnota větší nebo rovna 255
	dximagelist1.items.find('DelphiX').DrawAlpha(dxdraw1.surface, obdelnik, 0, alpha);
dxdraw1.Flip;
end;

Pochopitelně by nebyl problém udělat obrázek, který se průběžně skrývá a zase vynořuje, ale to už Vám nechám jako druhý domácí úkol.
A tady je zdrojový kód ke stažení (opět v Delphi 5).

- Tady jsou další obrázky


obr. 1, 2: průběh programu

A je to. Máte-li nějaké dotazy, pište na ICQ#299-545-993 (nebo raději do diskuze). Těším se na Vás u třetího dílu.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

1 názor  —  1 nový  
Hlasování bylo ukončeno    
0 hlasů
Google
Autor programuje v DelphiX, má rád mobily se Symbianem a PDA s Windows Mobile.

Nové články

Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Reklama
Reklama
Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý