14. Kreslíme "mišmaš" <<< Obsah >>> 16. Vedeme dialogy


15. Vybarvi si sám

Naším dalším úkolem na cestě za poznáním světa králíka Petra bude vytvoření grafického editoru umožňujícího vybarvování připravených obrázků. Naučíme se přitom pracovat s myší a se soubory. Naše představa o programu je následující. Program vyhledá ve své složce všechny obrázky (soubory BMP). Uživatel programu může mezi obrázky listovat a vylíváním ploch je vybarvovat (černá barva je přitom rezervována pro obrysy obrázků).

Řekněme si něco o souborech a složkách. Soubor je samostatný "kus dat" uložený v počítači. Může to být obrázek, dopis, tabulka, program. Uživatelské datové soubory často označujeme termínem dokumenty. Složka je, dá se říct, balík souborů. V Petrovi je obdobou složky skupina . Chceme-li vyjádřit, kde na disku leží některý soubor či složka, používáme k tomu označení zvané cesta. Cesta je výpis složek (případně i disku), přes které musíme projít při cestě za souborem (složkou). Oddělujeme je znakem zpětného lomítka "\", např. C:\Program Files\Petr\Peter.exe. Všimněte si, že disk označujeme písmenem a dvojtečkou. Na konci výpisu vidíte jméno programu. Tento výpis nazýváme plné jméno souboru. Obsahuje disk, složky, jméno souboru a příponu jména souboru. Přípona jména souboru je část za tečkou a udává typ souboru. Například příponou EXE označujeme programy.

Nejdříve založte nový program s názvem Vybarvi , popřípadě otevřete již hotový program z ukázkových programů Petra.

Upravíme velikost plochy. Máme představu, že budeme editovat obrázky se standardní velikostí 20 x 15 políček (640 x 480 grafických bodů). Na volbu barvy a obrázku potřebujeme dole v okně pás o výšce 1 políčka. Nastavte proto velikost hlavní plochy programu na 20 x 16 políček. Je to ještě vyhovující velikost plochy pro režim obrazovky 800 x 600 bodů. Tento režim obrazovky (videomód), ale raději větší, bychom měli doporučovat i uživatelům našich programů jako minimální vhodný.

Vytvořte dva nové předměty - šipka vlevo a šipka vpravo . Nakreslete do nich obrázky ovládacích tlačítek pro listování vlevo a vpravo, podklad bude šedý. Položte předměty do pravého dolního rohu plochy tak, jak to vidíte na předešlém obrázku.

Vytvořte hlavní smyčku programu - nekonečný podmíněný cyklus (v podmínce cyklu bude prvek ano ). V těle cyklu bude jeden příkaz čekání .

Před hlavní smyčku připravte skupinu s názvem inicializace programu. Skupina bude obsahovat přípravné operace nutné pro běh programu.

Prvním příkazem bude nastavení textu nápovědy do stavové lišty na spodním okraji okna. Neobsahuje-li stavová lišta žádný text, je vypnutá. Chceme-li používat v programu stavovou lištu, je dobré ji zapnout ihned na začátku programu. Je trochu nehezké, když se objeví nejdříve okno programu, a až po chvilce naskočí stavová lišta.

Tip: Prázdnou stavovou lištu zajistíte zobrazením znaku mezera.

Druhým příkazem je vyplnění plochy okna bílou barvou. V příkazu vyplněný obdélník uvedeme jediný parametr - bílou barvu obdélníku. Ostatní parametry nebudeme zadávat, tím zajistíme vyplnění celé plochy okna. Tento zdánlivě zbytečný příkaz zajistí, aby během načítání seznamu obrázků neproblikl před zobrazením prvního obrázku černý podklad. Důvody jsou pouze estetické, avšak nikdy nezanedbávejte podobné přechodové stavy programu. Ze všech těchto drobných negativních dojmů si uživatel vytváří celkový vztah k programu. Problikává-li občas někde něco co nemá, získává uživatel k programu nedůvěru. Stejně tak, když program dostatečně rychle nezareaguje na povel od uživatele nebo když uživateli není hned jasné jeho ovládání. Či snad dokonce když intuitivní příkaz má nežádoucí a neočekávané následky.

Třetím příkazem je funkce příprava obsluhy volby barvy. Nadefinuje použité barvy pro kreslení a zobrazí políčka s barvami. Zatím připravte pouze prázdnou funkci.

Následuje příkaz čekání s parametrem 0. Proč zde je? Jak víte, příkaz čekání zajišťuje zobrazení okna. Při startu programu není okno programu ihned zapnuto. Program čeká se zapnutím okna na první příkaz čekání, kdy předpokládá, že obsah okna je již připraven. Bez této vlastnosti by nám při startu programu problikávaly na displeji různé přechodné děje. Uvedený příkaz čekání s parametrem 0 zajistí zapnutí okna ihned po startu. Následující vyhledávání souborů chvilku trvá. Bez příkazu čekání by se okno zapnulo až po chvilce, po vyhledání všech souborů. Není to sice závada, ale pokud se okno programu neobjeví dostatečně brzo, uživatel může mít pochybnosti, zda program vůbec nabíhá, a zkusí ho spustit znovu.

Funkce načtení seznamu obrázků vyhledá všechny soubory BMP s obrázky. Funkce načtení obrázku načte do programu aktuální obrázek a zobrazí jej. Zatím připravte jen prázdné funkce. Poslední čtyři příkazy slouží k předefinování vzhledu kurzoru myši, o nich až později.

Spustíte-li teď program, uvidíte bílou plochu, vpravo dole dvě tlačítka a nápisy v nadpisu okna a ve stavové liště. Zatím nic moc, ale jsme teprve na začátku.

V okně Společných proměnných a funkcí vytvořte nový seznam s názvem seznam barev. Velikost seznamu nastavte na 36, to bude počet barev použitých v editoru. Ukazatel v seznamu přejmenujte na index barvy a automatický přírůstek na inkrementace indexu barvy. Do seznamu přidejte jeden číselný datový prvek barva.

Vytvoříme obsah funkce příprava obsluhy volby barvy. Přepněte se do ní dvojklikem myší na ikonu funkce. Úplný obsah funkce vidíte na následujícím obrázku. Po pravé straně je rozvinutý cyklus pro vytvoření políček barev.

Nejdříve naplníme seznam barev. Nastavte index barvy na 0 a inkrementaci indexu barvy na 1. Tím zajistíme, že se barvy budou do seznamu ukládat od začátku a po každém nastavení barvy se ukazatel seznamu automaticky zvýší o 1. Následují příkazy nastavení barev. Zvolte 36 barev dle vlastního výběru (ne černou - tu použijeme pro obrysy obrázků). Proč zrovna 36? Pro volbu barvy budeme mít k dispozici 18 políček a na každém políčku budou 2 barvy.

Políčka volby barev zobrazíme pomocí předmětů. Předměty jsou v této chvíli vhodnější než grafické vykreslení, protože při vylévání ploch by nám zřejmě mohlo natéct i do okének s barvami. Namísto ručního kreslení předmětů použijeme vytvoření programové. Je to snazší než upravovat 36 okének a především lze snadněji udržet soulad mezi okénky a skutečnými barvami, pokud barvy v programu někdy změníme.

Vytvořte si ve Společných proměnných a funkcích obrázek (ne předmět) okénko volby barev o velikosti 1x1 políčko. Nakreslete do něj okénka pro volbu 2 barev, asi takto:

Předměty budeme vytvářet tak, že obrázek vykreslíme do okna programu, vyplníme barvami, sejmeme z okna jako předmět a uložíme do plochy. K ukládání do plochy použijeme Lucku. Proto ji nastavíme na první políčko (horizontálně na 0) a otočíme doprava. Následuje cyklus pro všechny předměty barev (polovina počtu barev).

Prvním příkazem v cyklu je vykreslení obrázku okénka volby barev. V příkazu uvedeme pouze jediný parametr - obrázek k vykreslení. Nejsou-li ostatní parametry uvedeny, vykreslí se obrázek v levém dolním rohu okna.

Druhým příkazem je vylití levého okénka barvou ze seznamu barev. Souřadnice místa volíme ve středu okénka. Stejně tak vylijeme pravé okénko druhou barvou, opět do středu druhého okénka. Pamatujte, že ukazatel barev se posouvá automaticky.

Vytvořený obrázek předmětu sejmeme z okna funkcí úschova výřezu z plochy jako předmět a uložíme ho na pozici s Luckou. Potom Lucka popojde na další políčko.

Po vytvoření všech políček barev změňte inkrementaci indexu barvy na 0, od této chvíle již automatickou inkrementaci nebudeme v programu používat.

Připadá vám, že děláme v okně příliš mnoho operací a že snad takové operace musí být viditelné? Ve skutečnosti jsou tyto přípravné vykreslovací operace velmi rychlé a my máme dost času, než se obsah okna vykreslí na displeji prvním příkazem čekání. Vykreslený obrázek zůstane skryt pod prvním předmětem volby barev, takže se dokonce ani nemusíme starat o závěrečné vymazání obrázku.

Teď můžete program spustit. Je-li vše v pořádku, objeví se na spodní straně okna pás s barevnými okénky volby barev.

V okně Společných proměnných a funkcí připravte seznam pro uchování jmen všech nalezených souborů (podle obrázku níže). Dejte mu jméno seznam jmen obrázků.

Velikost seznamu nastavte na 1000. Je to možná příliš velká rezerva, ale z hlediska zaplnění paměti je to poměrně nepodstatné. Obecně každá proměnná seznamu zabere v paměti 4 bajty, pouze číselná proměnná 8 bajtů a logická 1 bajt. Náš seznam tedy zabere 4000 bajtů. Můžeme počítat s volnou pamětí až jednotky milionů bajtů.

Ukazatel v seznamu pojmenujte index obrázku, automatický přírůstek ukazatele přejmenujte na inkrementace indexu obrázku. Do seznamu přidejte textovou proměnnou s názvem jméno obrázku.

Vedle seznamu obrázků vytvoříme ještě číselnou proměnnou s názvem počet obrázků. Seznam zřejmě nezaplníme celý, proto bude tato proměnná uchovávat skutečný počet obrázků v seznamu.

Pustíme se do funkce načtení seznamu obrázků. Máte-li otevřen ukázkový program Vybarvi, můžete v něm vidět trochu složitější funkci. V ukázkovém programu je pro podporu víceuživatelského prostředí zajištěno načítání souborů i z domovské složky programu. My se spokojíme s jednodušší variantou a budeme soubory s obrázky načítat pouze z aktuální složky.

Připravíme si místní proměnné funkce. Jména nalezených souborů budou uložena do textové proměnné seznam jmen nalezených obrázků. Seznam abecedně setřídíme, pro tento účel budeme potřebovat ještě dvě textové proměnné - jméno jednoho obrázku a jméno jednoho obrázku 2.

Na dalším obrázku vidíte obsah funkce. Ve funkci načteme jména souborů obrázků z aktuální složky, přidáme jména souborů do seznamu a nakonec seznam jmen obrázků abecedně setřídíme.

K vyhledání souborů ve složce slouží funkce seznam souborů . Jako parametr funkce zadáváme v textové podobě specifikaci souborů k vyhledání. Při zadání se používá tzv. hvězdičková konvence (otazník "?" znamená libovolný znak, hvězdička "*" představuje libovolnou skupinu znaků). Lze zadat více specifikací, jednotlivé specifikace se oddělují znakem středníku ";". Například všechny soubory s obrázky BMP vyhledáme zadáním textu *.bmp, všechny soubory BMP i JPG (to je také formát obrázků podporovaný Petrem) vyhledáme zadáním textu *.bmp;*.jpg.

Funkce seznam souborů navrací víceřádkový text, ve kterém každý řádek obsahuje jméno jednoho nalezeného souboru včetně přípony jména souboru (ne ale cestu k souboru). Například při hledání souborů BMP bychom mohli dostat tento text:

Autíčko.bmp
Beran.bmp
Býk.bmp
Domeček.bmp
Drak.bmp

Jména jednotlivých souborů přidáme do seznamu jmen obrázků. Nejdříve nastavíme index obrázku na 0 a inkrementaci indexu obrázku na 1, využijeme automatické zvyšování indexu seznamu. Jako číslo řádku můžeme použít index obrázku, index se automaticky zvýší až po uložení jména.

Po uložení jmen všech souborů do seznamu použijeme konečný stav indexu obrázku k nastavení proměnné počet obrázků a vynulujeme inkrementaci indexu obrázku.

Následuje abecední setřídění seznamu jmen obrázků. Budeme postupovat od začátku seznamu ke konci a porovnáme vždy dvě sousední jména. Narazíme-li na nesetříděný pár, jména zaměníme a navrátíme se k předešlému páru, abychom zajistili případný odsun prvního jména směrem dolů k začátku seznamu.

Třídění proběhne v podmíněném cyklu. V podmínce cyklu testujeme, zda je ještě k dispozici další pár jmen. Na začátku cyklu uchováme první jméno do pomocné textové proměnné jméno jednoho obrázku. Zvýšíme ukazatel v seznamu jmen na další jméno a zjistíme, zda je první jméno abecedně dál (abecedně vyšší) než druhé jméno. Pokud ano, provedeme záměnu jmen.

Při záměně jmen uchováme do pomocné proměnné jméno jednoho obrázku 2 druhé jméno (na které je nyní nastaven ukazatel seznamu). Na jeho místo uložíme uschované první jméno. Snížíme ukazatel zpět k prvnímu jménu a uložíme původní druhé jméno na pozici prvního. Tím je záměna jmen ukončena.

Nakonec snížíme ukazatel v seznamu, abychom zajistili případné další odsunutí prvního jména směrem k začátku seznamu, není-li ještě správně zatříděno.

Dobře si metodu třídění prohlédněte a ujasněte její funkci. Nepatří mezi nejrychlejší, ale při své jednoduchosti je dostatečně dobrá.

Posledním příkazem ve funkci načtení seznamu obrázků je nastavení ukazatele seznamu jmen obrázků na hodnotu 0. To bude aktuální obrázek k zobrazení.

Vytvoříme obsah funkce načtení obrázku. Je poměrně jednoduchá, jak vidíte na obrázku níže. Potřebujeme k tomu pár prvků pro práci se soubory ze skupiny soubory . Nejdříve určíme aktivní soubor pro čtení podle jména obrázku ze seznamu jmen obrázků. Potom uvedeme prvek obrázek (podskupina data ) v příkazu pro vykreslení obrázku. To je vše.

Možná vás napadlo, co se stane, když nebude nalezen ani jeden soubor s obrázkem. V tom případě bude jméno obrázku obsahovat prázdný text a funkce pro čtení či ukládání obrázku nic neprovedou. V ukázkové verzi programu je navíc doplněn výpis textu informujícího uživatele, že nebyl nalezen žádný obrázek.

V této chvíli je již vhodné připravit si pár obrázků. Stačí alespoň jeden. Můžete k tomu použít grafický editor Petra. Velikost obrázku nastavte na rozměry 20x15 kroků (tj. 640x480 bodů). Obrysy kreslete černou barvou. Dbejte na to, aby čáry ohraničovaly uzavřené plochy, jinak vám barva "vyteče". Po nakreslení obrázku uložte obrázek do Knihovny proměnných a funkcí a pomocí Průzkumníka obrázek přeneste (ze složky typicky C:\Dokumenty\Petr\Picture) do stejné složky, jako je program Vybarvi. Můžete též použít vzorové obrázky Petra, najdete je ve skupině [vzory]\Kresby.

Máte-li ve složce programu Vybarvi připravený nějaký obrázek, můžete program na zkoušku spustit. Abecedně první z obrázků by se měl zobrazit v okně.

V programu budeme používat Petříka jako indikátor, která barva je právě zvolená. Vyvolejte editaci sprajtu Petříka (dvojklikem na ikoně Petřík v okně Společných proměnných a funkcí). Změňte parametry sprajtu (tlačítkem Vlastnosti ) na následující hodnoty: prodleva mezi fázemi = 110, fází na krok = 0, fází pro klid = 4, fází pro pohyb = 0, směrů = 1, šířka obrázku = 0.5. Vyhoďte obrázky Petříka ze sprajtu a dvojklikem do prvního obrázku vyvolejte editaci obrázku. Do obrázku nakreslete rámeček indikátoru, využijte střídající se barvy bílá-šedá-černá-šedá. Zkopírujte obrázek do dalších políček sprajtu a posuňte body vždy o 1 bod ve směru hodinových ručiček. Při zkoušce sprajtu uvidíte, jak rámeček "teče" po obvodě.

Lucku použijeme jako indikátor barvy pod kurzorem myši. Vyvolejte editaci sprajtu Lucky a nastavte parametry sprajtu: fází na krok = 0, fází pro pohyb = 0, směrů = 1, šířka obrázku = 0.5. Překreslete obrázek ve sprajtu tak, aby vytvořil dojem vyvýšeného okénka volby barvy. Střed přitom ponechejte průhledný.

V hlavní smyčce programu (před příkazem čekání) připravte skupinu s názvem zjištění a test platnosti barvy pod kurzorem. Zde budeme průběžně testovat barvu pod kurzorem myši, abychom mohli pro příslušnou barvu zapnout indikaci. Zjištěnou barvu budeme používat v programu i u dalších obsluh.

Ve Společných proměnných připravte dvě číselné proměnné: barva pod kurzorem myši a index barvy pod kurzorem. Na začátku skupiny tyto dvě proměnné nastavte na hodnotu -1 k indikaci, že pod kurzorem myši není platná barva. Následuje podmíněný příkaz, testující zda je kurzor myši nad plochou obrázku. Test zajistíme prvkem test myši v oblasti (skupina ovládání , podskupina myš ) s nastavenými parametry podle obrázku v okně. Je-li kurzor myši nad obrázkem, načteme barvu pod kurzorem funkcí načtení barvy bodu (skupina grafika ). Barvu uchováme v proměnné barva pod kurzorem myši. Souřadnice bodu k načtení barvy převezmeme ze souřadnic myši pozice myši v horizontálním směru a pozice myši ve vertikálním směru . V programech systému Petr je zajištěno, že informace o myši (stejně i o jiných zařízeních) se až do další obsluhy čekání nezmění.

Po načtení bodu se pokusíme barvu vyhledat v tabulce barev. Cyklus vyhledání barvy vidíte na obrázku vpravo. Cyklus prochází celou tabulku barev, každou barvu porovnává se zjištěnou barvou pod kurzorem. Nalezne-li odpovídající barvu, uschová její index do proměnné index barvy pod kurzorem, nastaví Lucku (jako indikátor barvy pod kurzorem) nad okénko s barvou a zapne viditelnost Lucky.

Všimněte si blíže, jak jsme cyklus použili. Index barvy v seznamu barev určuje barvu vybranou uživatelem. Cyklus projede celý seznam barev jednou dokola, po ukončení cyklu bude mít index barvy přesně stejnou hodnotu, jakou měl před zahájením cyklu. Využili jsme přitom automatického návratu ukazatele seznamu na začátek po překročení konce seznamu.

Pozastavme se u Lucky. V celém programu ponecháváme vertikální souřadnici Lucky trvale na výchozí hodnotě 0. Horizontální souřadnici nastavujeme na poloviční hodnotu indexu barvy pod kurzorem, protože okénka barev jsou široká polovinu políčka. Pokud vás zaráží, že Lucka může stát i mezi políčky, tak je tomu skutečně tak. Při nastavování pozice Lucky zadáním souřadnic můžeme používat libovolné hodnoty, včetně hodnot mimo plochu okna, neboť Lucka je běžným sprajtem. Pouze při pohybování Lucky pomocí příkazu krok se Lucka (stejně i Petřík) omezuje na plochu okna a cílová souřadnice je zarovnána na nejbližší políčko.

Za podmíněným příkazem pro načtení barvy následuje podmíněný příkaz zajišťující vypnutí indikátoru barvy, není-li pod kurzorem myši platná barva. To může nastat nejen v případech, kdy je kurzor myši mimo plochu obrázku, ale také je-li pod kurzorem myši černá (nebo nějaká neznámá) barva.

Program spusťte a vyzkoušejte. Měla by již být funkční indikace barvy pod kurzorem myši. Najedete-li myší v obrázku nad nějakou barvu, okénko s příslušnou barvou vystoupí nad povrch okna.

Začneme s ovládáním, a to nejdříve s ovládáním pomocí klávesnice. Doplňte za skupinu pro zjištění barvy prvek vícestupňové větvení příkazů se jménem obsluha kláves. V testované hodnotě použijeme funkci vstup klávesy (nečeká na stisk) .

První větev větvící konstrukce vytvoříme pro klávesu Esc . Jako obsluhu větve použijeme příkaz přeruš opakování , který přeruší hlavní smyčku programu.

V druhé větvi obsloužíme klávesu vlevo . V obsluze větve uveďte funkci předešlý obrázek, předtím funkci vytvořte (zatím prázdnou). Za funkci doplňte příkaz vyprázdnění zásobníku kláves . Načítání obrázku chvíli trvá. Pokud uživatel klávesu drží, přichází kódy kláves rychleji, než je program schopen přepínat stránky. Program by tak pokračoval v listování obrázky i po uvolnění klávesy. Ovládání by mělo "setrvačnost", což není příjemné.

Podobně obsloužíme klávesu vpravo , jen použijeme funkci další obrázek. Můžete ještě obsloužit další listovací klávesy, jako například Home pro skok na první obrázek, End pro skok na poslední obrázek, Ctrl+vlevo/vpravo na listování po 10 obrázcích.

Poslední klávesou bude Back Space . S její pomocí může uživatel obnovit obrázek do původní podoby jako před editací. Obsluhu zajistíme funkcí načtení obrázku, která znovu načte obrázek ze souboru. Následuje opět vyprázdnění zásobníku kláves.

Na obrázku níže vidíte obsluhu funkcí předešlý obrázek (po levé straně) a další obrázek (vpravo). Na začátku funkcí se uloží aktuální obrázek, pokud byl změněn. Zatím vytvořte jen prázdnou funkci uložení obrázku.

Ve funkci předešlý obrázek ověříme, zda nepracujeme s prvním obrázkem. Pokud ne, můžeme posunout ukazatel obrázků na předešlý obrázek a provést načtení a zobrazení nového obrázku. Pro první obrázek se neprovede nic, ale mohli bychom nastavit ukazatel na poslední obrázek (je to počet obrázků - 1) a přepínat obrázky dokola.

Podobně ve funkci další obrázek otestujeme, zda to není poslední obrázek. Číslo posledního obrázku získáme z počtu obrázků snížením o 1. Není-li to poslední obrázek, zvýšíme ukazatel na další obrázek a načteme nový obrázek. U posledního obrázku bychom mohli nastavit první obrázek a zajistit tak cyklické listování.

Program vyzkoušejte. Obrázky je teď možné listovat pomocí kláves vlevo/vpravo a program ukončit klávesou Esc.

Zatím nebudeme vytvářet funkci pro ukládání, abychom si nepovedeným pokusem nepřepsali nějaký obrázek. Vytvoříme nejdříve obsluhu ovládání myší. Do hlavní smyčky za obsluhu kláves přidejte podmíněný příkaz s názvem kliknutí levým tlačítkem myši.

Do testu podmínky vložte klik levým tlačítkem myši . Je to logický příznak a je nastaven vždy, když uživatel klikne levým tlačítkem myši do okna programu. Vypnutí příznaku se provede jeho čtením, například použitím v podmínce. Chcete-li příznak kliknutí testovat vícekrát, uschovejte si jej do logické proměnné .

Pokud v testu podmínky zjistíme, že uživatel kliknul myší, rozlišíme v dalším podmíněném příkazu podle vertikální souřadnice myši, zda se jednalo o kliknutí do obrázku nebo do pásu s barvami a tlačítky. Hranicí rozlišení je 1, protože pás je vysoký 1 políčko.

Pro obsluhu volby barvy připravíme novou funkci s názvem volba barvy. Do vstupních proměnných funkce dáme číselnou proměnnou pozice kurzoru myši X. S její pomocí budeme funkci předávat horizontální souřadnici myši v poli volby barev.

Ve funkci převezmeme hodnotu vstupní proměnné, vynásobením číslem 2 souřadnici převedeme na číslo barvy, funkcí celočíselná část odstraníme nepotřebnou desetinnou část a výsledek použijeme k nastavení nového indexu barvy. Nastavíme horizontální souřadnici Petříka na poloviční hodnotu indexu barvy, což odpovídá souřadnici okénka s barvou. Petříka v programu používáme jako indikátor vybrané barvy. Jeho vertikální souřadnice zůstává trvale nastavena na 0, proto si jí nemusíme všímat.

Zjistíme-li z vertikální souřadnice myši, že uživatel kliknul do pásu tlačítek a volby barev, rozlišíme dále podle horizontální souřadnice myši, zda kliknul do volby barev nebo na tlačítka. Pro horizontální souřadnici menší než 18 je obsloužena volba barvy. Zavoláme funkci volba barvy s horizontální souřadnicí myši jako parametr. Jinak se jedná o tlačítka přepínání obrázků. Pro horizontální souřadnici menší než 19 je tlačítko vlevo, voláme funkci předešlý obrázek, jinak voláme funkci další obrázek. Celou obsluhu volby barvy nebo tlačítek vidíte zde na obrázku:

Program můžete vyzkoušet. Levým tlačítkem myši je možné přepínat obrázky a v pásu volby barev měnit vybranou barvu.

Nyní obsloužíme případ, kdy uživatel kliknul levým tlačítkem myši do oblasti obrázku. Základem obsluhy bude podmíněný příkaz vylití obrázku barvou (na dalším obrázku). V testu podmínky ověříme, zda pod kurzorem myši není černá barva. Černou barvu používáme pro obrysy obrázků a nesmíme ji vylít. Barvu pod kurzorem myši jsme si uschovali do pomocné proměnné na začátku hlavní smyčky programu.

V obsluze vylití obrázku barvou použijeme příkaz Výplň . Barvu určí proměnná barva ze seznamu barev. Souřadnice výplně převezmeme ze souřadnic myši. Nakonec nastavíme příznak změny obrázku, který připravíme v okně Společné proměnné a funkce. Příznak indikuje, že je potřeba obrázek uložit.

Program spusťte. Vyzkoušejte vylévání obrázku vybranou barvou a ověřte, že nelze vylít černý obrys obrázku.

Obsluha pravého tlačítka myši bude vypadat velmi podobně, proto můžeme zkopírovat celou obsluhu levého tlačítka myši. V testu podmínky nahradíme prvek testu kliknutí levým tlačítkem prvkem pro pravé tlačítko . Obsluha výběru funkce nebo barvy zůstává nezměněna. Obsluhu vylití obrázku barvou vyhodíme a na její místo dáme obsluhu nabrání barvy pod kurzorem myši. V obsluze otestujeme proměnnou index barvy pod kurzorem, zda je pod kurzorem myši platná barva (zda to není černá nebo nestandardní barva). Ukazuje-li kurzor myši na platnou barvu, nastavíme ji jako novou vybranou barvu (přepočteme barvu na souřadnici X).

Zkouškou programu můžete ověřit ovládání volby barvy a obrázku pravým tlačítkem myši stejně jako u levého tlačítka. Kliknutím pravým tlačítkem myši do plochy obrázku lze "nabrat" barvu pod kurzorem myši a nastavit ji tak jako vybranou barvu.

Editace je hotova a konečně se dostáváme k funkci uložení obrázku. Obsah funkce vidíte na obrázku níže. Nejdříve otestujeme, zda byl obrázek změněn a jestli je tedy nutné jeho uložení. Pokud ano, použijeme jméno obrázku (ze seznamu jmen obrázků) jako aktivní soubor pro zápis . Dále nastavíme velikost souboru na 0, aby v souboru za obrázkem nezůstala případná stará data. Obrázek uložíme tak, že funkcí úschova výřezu z plochy jako obrázek sejmeme obrázek z okna a předáním do prvku obrázek provedeme zápis obrázku do souboru. Závěrem vypneme příznak změny obrázku.

Funkci uložení obrázku doplňte za hlavní smyčku programu, aby se obrázek uložil při ukončení klávesou Esc. Nyní je program po stránce funkčnosti kompletně hotov a můžete ho vyzkoušet. Ověřte, zda se změny v obrázcích ukládají při přepínání obrázků i při ukončení programu klávesou Esc.

Náš program můžeme ještě dále vylepšovat. Například zajistíme, aby se v nadpisu okna objevovalo jméno obrázku, číslo obrázku a celkový počet obrázků. Obsluhu doplníme na začátek funkce načtení obrázku podle dalšího obrázku. Výsledkem bude text jako například "Vybarvi - Domeček (obrázek 4 z 50)". Na obrázku to není patrné, ale nezapomeňte na patřičných místech v textech mezery (na konci textu "Vybarvi - ", na obou stranách " (obrázek " a také " z "). Jméno souboru zobrazíme bez přípony, proto z konce textu odstraňujeme 4 znaky (tečku a text BMP).

Dalším vylepšením bude předefinování kurzoru myši. V okně Společné proměnné a funkce si připravte 4 předměty s obrázky kurzorů - šipky, kapátko a výplň.

Obrázky mají černý obrys, okolí je průhledné a vnitřek vyplněn bílou barvou. Na vrcholy kurzorů kapátka a výplně doplníme žlutou tečku coby ukazovací místo kurzoru (s inverzí barev). U ostatních kurzorů zůstane ukazovací místo implicitně uprostřed obrázku.

Ve skupině inicializace programu určíme pomocí příkazů nadefinování vzhledu kurzoru myši , jaký vzhled ve které části okna bude kurzor myši mít. Pro pole výběru barvy nadefinujeme kapátko, pro ovládací tlačítka šipky vlevo a vpravo, pro plochu obrázku kurzor výplně.

Abychom si ujasnili funkci příkazu pro definování vzhledu kurzoru myši, můžeme si představit oblasti definice vzhledu myši jako obdélníky, které postupným přidáváním překrývají staré definice. Platí vždy definice nejvíce na vrcholu. Nezadáme-li žádný obrázek myši, použije se standardní vzhled myši v okně. Máme-li ve Windows nadefinován barevný kurzor, použije se tento barevný kurzor. Nezadáme-li rozměry oblasti, předefinuje se kurzor myši pro celé okno. Všechny definice můžeme zrušit uvedením příkazu bez jakýchkoliv parametrů.


14. Kreslíme "mišmaš" <<< Obsah >>> 16. Vedeme dialogy