Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 191. – GDI grafika, dokončení

Jan Šindelář 29.6.2005

Dnes si dokončíme povídání z minula. Ukážeme si, jak kreslit i přímo pomocí Windows API a také si řekneme něco málo o bitmapách.

Jde to i s API

V minulém dílu jsme se seznámili se základními příkazy pro kreslení v prostředí Delphi. Využívali jsme rozhraní GDI a příkazy v Delphi nám jen vhodně zaobalily samotné příkazy API. Někdy však můžeme mít důvod nepoužít VCL, ale rovnou API. Je to sice cesta poněkud složitější, ale základní funkce jsou velmi podobné.

Chcete-li zkusit API pouze kvůli rychlosti, asi vás zklamu. Kreslení je oproti funkcím z VCL stejně rychlé (resp. spíš stejně pomalé). VCL funkce nedělají nic jiného než to, že v konečném důsledku volají právě přímo API funkce, takže kreslení probíhá zcela identicky. Sice se teoreticky musí vyskytovat nějaká "režie" během tohoto zprostředkování, avšak na celkový výkon to má zcela zanedbatelný a prakticky neměřitelný vliv (pravděpodobně zapracuje i samotný kompilátor a optimalizace).

Jak budeme tedy kreslit bez VCL? Zatímco s využitím Delphi funkcí bylo všechno relativně snadné, zde narazíme na jeden základní rozdíl. Objekty naší aplikace jsme mohli prostřednictvím VCL identifikovat jejich názvem a stačilo tedy napsat např. Form1.Canvas (abychom pracovali s plátnem formuláře). Při volání API funkcí však musíme použít jinou identifikaci. Tímto identifikátorem bude handle jednotlivých objektů. Právě pomocí této vlastnosti, kterou Windows objekty mají, k nim můžeme přímo přistupovat.

Zatímco z VCL tedy budeme volat funkci:

Canvas.LineTo(x ,y);

v API použijeme volání:

LineTo(Canvas.Handle, x, y);

Obdobným způsobem pak vypadají i další funkce jako TextOut, ExtFloodFill či MoveToEx. Detailní popis dalších funkcí GDI nemá smysl uvádět a nejdete jej zde.

Dost však o kreslení pomocí API. I když v jiných případech je jeho použití opodstatněné (a někdy to dokonce ani jinak nelze), v případě tohoto jednoduchého kreslení jistě nebudete o nic méně profesionální, pokud použijete VCL. Výjimkou je samozřejmě situace, kdy tvoříte extrémně malou aplikaci, vše (včetně oken a ovládacích prvků) kreslíte pomocí API a VCL nepoužijete vůbec. Jednoduchý příklad jak použít API najdete v ukázkovém projektu, ale vlastně se liší pouze jiným zápisem funkce a jejích parametrů.

Práce s bitmapou

Nyní si povíme ještě něco krátce o bitmapách. Pokud nechcete mít obrázky pevně zabudované v programu (např. prostřednictvím komponenty Image), chcete s nimi vytvářet jednoduché animace či jiná kouzla, můžeme je načíst do příslušné předem připravené (ovšem rovněž až za běhu vytvořené) proměnné. Pracovat můžeme s obrázky BMP, s ikonami, s obrázky JPEG a podobně. Všechny budu nazývat pro zjednodušení bitmapami.

Obrázek můžeme načíst z externího souboru (jako v naší ukázce), ze zdrojů a podobně. Máme-li obrázek načten a uchován v proměnné, můžeme jej ve vhodnou chvíli na plátno vykreslit prostřednictvím funkce Draw. Stačí specifikovat souřadnice a proměnnou, ve které máme obrázek uložen. Kromě metody Draw můžeme použít i StretchDraw, která danou bitmapu vykreslí přesně do zadaného obdélníku, takže případně upraví jeho rozměry. Vzhledem k nutnosti přepočítání rozměru obrázku je pochopitelně tato funkce daleko pomalejší než běžné Draw.

A to je pro dnešek všechno. Nyní už umíme základní funkce pro kreslení s využitím VCL, totéž umíme s použitím samotného API a nakonec jsme si ukázali základní práci s obrázky. Teď už vám nic nebrání pustit se do pokusů s grafickými efekty či jednoduchými animacemi. Nezapomeňte však, co jsme si říkali na začátku - GDI není vhodné pro komplikovanou grafiku kvůli své pomalosti. Raději to tedy s tímto typem kreslení v aplikacích nepřehánějte.

V ukázkovém projektu najdete kreslení náhodných čar pomocí VCL i API a dále jednoduchou práci s bitmapou. Všimněte si, že objekt je vytvořen spolu s hlavním formulářem (a rovněž zničen s jeho ukončením). Celou dobu máme tedy obrázek k dispozici uložen v proměnné. Ne vždy je tento postup samozřejmě vhodný, v určitých případech bude lepší jej načíst (resp. vytvořit proměnnou) až v momentě, kdy bude opravdu zapotřebí.

Ale to už je opravdu konec. Slíbený ukázkový projekt stahujte zde.