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

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       12 568×

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

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 Hybridní inteligentní systémy 2

Hybridní inteligentní systémy 2

V technické praxi využíváme často kombinaci různých disciplín umělé inteligence a klasických výpočtů. Takovým systémům říkáme hybridní systémy. V tomto článku se zmíním o určitém typu hybridního systému, který je užitečný ve velmi složitých výrobních procesech.

Obrázek ke článku Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Vedení týmu v oboru informačních technologií se nijak zvlášť neliší od jiných oborů. Přesto však IT manažeři čelí výzvě v podobě velmi rychlého rozvoje a tím i rostoucími nároky na své lidi. Udržet pozornost, motivaci a efektivitu týmu vyžaduje opravdu pevné manažerské základy a zároveň otevřenost a flexibilitu pro stále nové výzvy.

Obrázek ke článku Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Za poslední rok se podoba práce zaměstnanců změnila k nepoznání. Především plošné zavedení home office, které mělo být zpočátku jen dočasným opatřením, je pro mnohé už více než rok každodenní realitou. Co ale dělat, když se při práci z domova ztrácí motivace, zaměstnanci přestávají komunikovat a dříve fungující tým se rozpadá na skupinu solitérů? Odborníci na personalistiku dali dohromady několik rad, jak udržet tým v chodu, i když pracovní podmínky nejsou ideální.

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý