GUI grafických aplikací



Podobné dokumenty
ZP4CS 10. hodina Kreslení deskové hry. Aleš Keprt duben 2015

GUI grafických aplikací GUI pro Othello

Evropská obchodní akademie, Děčín I, Komenského náměstí 2, příspěvková organizace IČ tel

Nejzajímavější jsou události MouseDown a KeyDown.

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

dokumentu, respektive oddílu (více o oddílech v další kapitole). Nemůžeme

Desatero, aneb nejčastější chyby v programování

Soukromá střední odborná škola Frýdek-Místek, s.r.o. VY_32_INOVACE_03_IVT_MSOFFICE_02_Excel

Operační systémy 2 Základy Windows API

GIS Mikroregionu Telčsko

Projekt Obrázek strana 135

17. Projekt Trojúhelníky

Windows 7 instalace krok za krokem

Programy pro OS Windows

WINDOWS 7 ZÁKLADY. Na konci roku 2012 přišly na trh nové Windows 8, které revolučně mění ovládání a jsou orientovány především na dotykové ovládání.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

15. Projekt Kalkulačka

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

Dokument a jeho části oddíly, záhlaví, zápatí

Vkládání prvků do dokumentu MS Word

Jazyk C# (seminář 9)

Multimediální prezentace MS PowerPoint I

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

Nápověda pro ovládání automaticky čtené učebnice

1. Základní pojmy, používané v tomto manuálu. 2. Stránky

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Rozšíření Hessova Plátna na Weissovo plátno

Hodnocení soutěžních úloh

POČÍTAČOVÁ GRAFIKA VEKTOROVÁ GRAFIKA VÍCENÁSOBNÉ KOPÍROVÁNÍ

Manuál SW lokalizace problémů a hodnot v dynamické mapě

Voltampérová charakteristika diody

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Interpretace zkoušek a vytvoření geologického modelu

František Hudek. březen ročník

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

1. Předmluva. 2. Uživatelské účty. Vážení rodiče,

Jazyk C# (seminář 6)

1 Přihlášení do aplikace Online Operátor. 2 Nastavení pro Adobe Flash Player

Př. program s popojíždějícím autíčkem o 50 pixelů při každém stisku Popojeď

Java - Kresba. 2/28/11 1/8 Java - kresba

MS OFFICE, POWERPOINT

4 Microsoft Windows XP Jednoduše

Návod k použití oddílového webu

Vytvoření a úpravy geologického modelu

Metodický list k didaktickému materiálu

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

X-Sign Basic Uživatelská příručka

Programování v jazyce VISUAL BASIC.NET

Nejčastější kladené dotazy

MRBT. Stacionární průmyslový robot EPSON C3 aplikace pro prezentaci

Vkládání dalších objektů

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

IRAE 07/08 Přednáška č. 7. Začátek (head)

KMI / TMA Tvorba mobilních aplikací. 9. seminář ZS 2016/2017 Středa 13:15-15:45

Komponenty v.net. Obsah přednášky

Psaní závěrečné práce. Přednáška pro končící studenty

Návod pro používání Automaticky Čtených Učebních Pomůcek vytvořených v rámci projektu ARET

Lekce 12 Animovaný náhled animace kamer

WDLS (BUILDINGDESIGN)

Tvorba webových stránek na google Sites (1.)

je aplikace určená k editaci videozáznamu, funguje v operačních systémech Windows Vista a Windows7

Demonstrační kufřík TAC XENTA

Jednoduché stříhání videa

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

20. Projekt Domácí mediotéka

INFORMATIKA MS WORD TVORBA VLASTNÍHO STYLU

1 Přihlášení do aplikace Online Operátor Chat

Soubory s reklamami musí mít stejný název jako ta výše uvedené. Stávající soubory reklam budou přepsány.

2 Grafický výstup s využitím knihovny

Téma 1: Práce s Desktop. Téma 1: Práce s Desktop

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Stejnou věc můžete udělat naráz v jednom příkazu. Ikonku animovaného předmětu pak stačí použít jen jednou na začátku řádku.

Databáze pro evidenci výrobků

Jazyk C# (seminář 7)

Výčtový typ strana 67

DUM č. 9 v sadě. 30. Inf-6 Imagine Logo a animace pro nižší gymnázium

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

PowerPoint. v PowerPointu se pracuje se snímky, u kterých je možné si vybrat rozvržení obrazovky

Omezení funkcionalit v softwaru STATISTICA

DUM č. 11 v sadě. 25. Inf-1 Animace (bitmapové i vektorové)

Zabezpečení webové vrstvy a EJB projektu Část nastavení specifická pro Glassfish, část dána Java EE

Fingerprint Verification Control

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Proces editace JOSM. Tato příručka může být stažena jako josm_more-about-josm_en.odt or josm_more-aboutjosm_en.pdf

Konfigurace Windows 7

Autodesk AutoCAD Civil 3D

FORMÁTOVÁNÍ 1. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

Vytváříme dobré aplikace vykreslovače grafiky v programovém prostředí Control Web

Redakční systém WordPress MU Manuál pro uživatele

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Práce se styly 1. Styl

CMS. Centrální monitorovací systém. Manuál

Transkript:

GUI grafických aplikací verze s komentářem Aleš Keprt Katedra informatiky UP duben 2006, aktualizace březen 2007, duben 2008

Windows Událostmi řízené aplikace Každá aplikace má frontu zpráv Funkce main() vykonává kód: Message msg; while(getmessage(&msg)) { } DispatchMessage(&msg); GetMessage blokuje až do příchodu zprávy DispatchMessage předá zprávu do WndProc WndProc zpracuje zprávu 2/20

Jak vypadá WndProc? long* WndProc(HWND hwnd, UINT msg, UINT wparam, ULONG lparam) { switch(msg) { case WM_CLOSE: case WM_PAINT: case WM_KEYDOWN: } hwnd (okno), msg = zpráva + 2 parametry Návratová hodnota = odpověď na zprávu 3/20

Překreslování grafiky ve Windows Když chce aplikace něco překreslit, tak zavolá systémovou funkci Invalidate() = zneplatnění Jako parametr určí oblast okna k překreslení Systém pošle oknu zprávu WM_PAINT Systém invalidované oblasti sčítá a optimalizuje tak překreslování Dokud se okno nepřekreslí, žádné další WM_PAINT zprávy nepřijdou Zpracování zprávy WM_PAINT: Pomocí funkcí GDI si okno překreslí svůj obsah Případně použijeme OpenGL nebo DirectX 4/20

Proč je to tak složité? Systém má šanci, aby ignoroval invalidace, když má důležitější práci Aplikace volá Invalidate při každé změně obsahu když to dělá moc často, systém nechá překreslit okno jen občas záleží na rychlosti počítače 5/20

Jak se dá kreslit GDI standardní rozhraní Windows Výhody: úplně jednoduché Nevýhody: téměř bez HW akcelerace, závislé na rozlišení GDI+ - nahrazuje GDI v.netu Výhody: nativně objektové, částečně akcelerované Nevýhody: Stále daleko od DX, stále závislé na rozlišení DirectX Výhody: Nejlepší funkcionalita, nejrychlejší běh Plná HW akcelerace, nezávislost na rozlišení Nevýhody: Extrémně složité, neumí formulářové prvky OpenGL obdoba DirectX, ale je jednodušší Výhody: multiplatformní, jednodušší než DX Nevýhody: Užší funkcionalita, jen 3D grafika, neobjektové WPF nástupce GDI+ (.NET 3.0) Výhody: lepší objektový model, již nezávislé na rozlišení 6/20

Nejzajímavější je otázka závislosti na rozlišení. Moderní grafické systémy nejsou závislé na rozlišení monitoru. Výhodou je, že programy pak vypadají pořád pěkně, bez ohledu na to, na jakém monitoru a v jakém rozlišení je pouštíte. Ve Windows zatím tento princip používá jen Media Player a samozřejmě většina počítačových her (bohužel ne všechny). Uvidíme, jaký bude Internet Explorer 7 protože nějaký pokrok právě zde lze tušit Microsoft před nedávnem uvolnil další verzi knihovny WPF, také známé jako Avalon, která by měla vymoženosti dříve známé jen z DirectX přinést do klasických okenních aplikací ve Windows. Ve vašich programech se však vždy řiďte heslem: Nepoužívat lopatu na komáry. Jsou-li grafické požadavky programu jednoduché, použijte jednoduchou knihovnu (např. GDI).

Jaké mohou být problémy Nelze ovlivnit, jak často se obraz překresluje Proto přehrávače filmů obcházejí princip invalidace přímým kreslením na obrazovku Při rychlém překreslování grafika bliká Double buffering existuje jen v OpenGL a DirectX Obecně se může stát, že hardware zobrazí obraz částečně starý a částečně nový, protože monitor nepočká, až připravíme celý nový obraz V GDI řešíme pomocí kreslení přes bitmapu GDI+ toto řeší nativně snadný život programátora Ve Windows Vista prý nikdy nic nebliká (Aero UI) 7/20

Jakých chyb se vyvarovat? Grafiku překreslujte výhradně v obsluze zprávy WM_PAINT Nikdy nevynucujte překreslení pomocí Update(), ale jen invalidujte okno pomocí Invalidate() Grafiku přenášejte do okna najednou; v případě potřeby použijte kreslení do bitmapy Nepoužívejte OpenGL a DirectX pro triviální programy s jednoduchou grafikou Dávejte přednost GDI+ (případně WPF), protože je nativně objektové 8/20

Potřebujete-li animovanou grafiku, pak se vám může stát, že v některých specifických případech budete muset ustoupit od obvyklých principů a kreslit grafiku přímo. Zatímco běžný systém pomocí Invalidate a WM_PAINT umožní třeba 10 nebo 30 překreslení za sekundu, pomocí přímého kreslení lze dosáhnout mnohem větší rychlosti. Jedna z mých her třeba kdysi na procesoru Pentium 60 překreslovala 11000 obrázků za sekundu ano, měla jednoduchou grafiku a kreslil jsem ji pomocí DirectX. Otázkou opět je, zda je to u daného konkrétního programu nutné. Následuje modelový příklad řešení GUI pro dámu. Příklad je v GDI+. Je to nativně objektová knihovna, která je součástí.netu. Na rozdíl od toho, co bylo řečeno v úvodu této přednášky, programy v.netu nemají žádnou smyčku zpráv a WndProc. Namísto toho jsou založeny na událostech, jde o tzv. event driven programming. Událostem přiřadíte obslužné funkce/metody, čímž zajistíte, aby při příchodu určité zprávy, které způsobí právě vznik oné události, byl vykonán kód vaší metody. Příklad: Chceme v.netu udělat nějakou činnost při stisku tlačítka. Pak stačí na formulář přidat tlačítko a do kódu (třeba do konstruktoru) napsat button1.click += a 2x stisknout Tab. Dvojitý stisk klávesy Tab vloží do kódu vše potřebné a zbývá jen dopsat kód, který se má vykonat při stisku toho vašeho tlačítka. Konkrétně pro překreslování grafiky samozřejmě využijeme událost Paint.

Příklad: GUI pro dámu Čtvercová šachovnicová plocha Myší lze posouvat kameny (tj. řešíme i vstup) Příklad realizace v GDI+ Čtvercová grafická plocha, nijak ji nedělíme Připravíme si obrázky políček a kamenů Překreslujeme vždy celou plochu Zachytáváme pohyb a klikání myší 9/20

Příprava (1.) typ Piece, obrázky enum Piece { None, DarkMan, DarkKing, LightMan, LightKing, } + grafika prázdných políček 10/20

Příprava (2.) typ Board class InvalidCoordinatesException : Exception; class Board { public const int boardsize = 10; // Zkontroluje,že pozice je platná (tj. v mezích velikosti šachovnice) // Pokud není, vyhodí výjimku InvalidCoordinatesException public void CheckPosition(int x, int y); // Toto je jen pro kontrolu // Vrací typ figurky na dané pozici public Piece GetPiece(int x, int y); // Pohne figurkou public void MovePiece(int sx, int sy, int dx, int dy); } 11/20

Příprava (3.) grafika přesunu kamenů Chceme mít funkci uchop kámen myší a přetáhni jej na novou pozici Potřebujeme grafiku kámen bez políčka Ořežeme jeden kámen na oblý tvar Ostatní tři kameny dopočítáme programem Máme tak zajištěno, že všechny vypadají stejně 12/20

Jdeme na věc Aby toho nebylo moc najednou, neřešíme objektový návrh vše nacpeme do třídy okna Visual Studio 2005, založíme nový projekt Nastavíme černé pozadí oknu Vložíme PictureBox, pojmenujeme pad Velikost obrázku je 64x64 const tilesize = 64 upravíme velikost padu a okna (v konstruktoru) pad.width = pad.height = Board.boardsize* tilesize ClientSize = new Size(pad.Width + pad.left*2, pad.height+pad.top*2) 13/20

Nutno upozornit, že místo PictureBox tady lze použít jakýkoliv jiný objekt typu odvozeného od třídy Control. My totiž ve skutečnosti z toho picture boxu použijeme jen to, že sám nijak nepřekresluje ani nemaže své pozadí. Proč je opravdu možné tam dát úplně cokoliv, nejlépe úplně prázdný objekt Control, najdete v nějaké knize podrobněji popisující principy GUI. (Mělo by to platit i mimo Windows, nicméně nechci se v tom vrtat.)

Načtení obrázků Obrázky načteme do objektů typu Bitmap Použijeme 3 pole Deklarace: Bitmap[] tiles, pieces, moving; Naplnění: tiles[0] = new Bitmap( dark.png ); Obrázky pro pohyb musíme vypočítat Jeden použijeme jako vzor a ostatní ořežeme Bitmap output = (Bitmap)source.Clone(); Color transparent = pattern.getpixel(0, 0); output.maketransparent(transparent); if(pattern.getpixel(x, y) == transparent) output.setpixel(x, y, transparent); 14/20

Kreslení Aby to hned něco dělalo, přidáme kreslení pad Properties událost Paint Toto lze dělat i programově, ale přes Visual Studio je to snazší (stačí párkrát kliknout ) Projdeme všechna políčka a nakreslíme void pad_paint(object sender, PaintEventArgs e) { e.graphics.drawimage(img, x, y, tilesize, tilesize); } Poznámka: Počátek souřadnic GDI+ je vlevo nahoře Je ale dobré mít počátek desky vlevo dole Není dobré vázat dohromady GUI a logiku hry 15/20

Zde je zajímavé podotknout, že metoda Graphics.DrawImage umí i zmenšovat a zvětšovat kreslené bitmapy. Čili při troše snahy můžete nakonec i pomocí GDI+ dosáhnout toho, že váš program bude víceméně nezávislý na rozlišení monitoru. Prostě podle toho, jak bude uživatel myší měnit velikost okna, budete upravovat velikosti políček na šachovnici. Řešení už je na vás, jistě to zvládnete. Následující slidy se zabývají řešením ovládání pomocí myši. Nutno upozornit, že myš, ačkoliv je to vstup, přímo souvisí s oknem, do kterého kreslíme výstup. Teoreticky se sice vždy doporučuje, abyste ve vašich programech nějak rozumně vstup a výstup oddělili pro přehlednost kódu ale vždy nakonec budete muset obojí napojit do jedné třídy, neboť vstup a výstup se vždy týkají nějakého okna. Zkuste to napřed napsat dohromady, pak jistě přijdete na to, jak to vhodně oddělit a zpřehlednit. Ovládání myší bude vyžadovat mj. metodu PointToClient, která přepočítává souřadnice myši z celoobrazovkových (myš má vždy počátek vlevo nahoře na primárním monitoru) do souřadnic objektu (v našem případě pad). Tak se toho nelekněte!

Ovládání myší (1.) Převod souřadnic myši na číslo políčka: x / tilesize, Board.boardsize 1 y / tilesize Událost MouseDown Je-li stisk na pozici s kamenem, zapamatujeme si pozici stisku a začneme přetahovat kámen pickedpos souřadnice na desce Když je tam kámen, tak mousedown = true, Cursor = Cursors.Hand a invalidujeme pad Musíme doplnit kód do Paint, aby se nekreslil kámen, který držíme myší: testujeme mousedown && pickedpos Musíme invalidovat pad, jinak se to nepřekreslí 16/20

Ovládání myší (2.) Událost MouseMove Kreslíme kámen během tažení myší if(mousedown) pad.invalidate(); Vlastní kreslení musí být opět v Paint (!) Souřadnice: pad.pointtoclient(mouseposition) Událost MouseUp Obsluhujeme jen při mousedown Pokusíme se pohnout kamenem board.movepiece(pickedpos.x, pickedpos.y, c.x, c.y); Vrátíme zpět podobu myši a invalidujeme pad Cursor = Cursors.Default 17/20

Ovládání myší (3.) Událost MouseLeave Když myš opustí okno během tažení kamene, vrátíme kámen zpět na původní místo Ošetření chyby Při neplatném tahu zobrazíme pozadí okna na chvíli v červené barvě Realizujeme to pomocí časovače Založíme System.Windows.Forms.Timer Zapneme jej vždy při chybě a vypneme při prvním tiku Pomocí Form.BackColor změníme barvu pozadí okna 18/20

Doladění objektové struktury Není vhodné nacpat vše do třídy Form1 Oddělíme jednotlivé části Třída hry (Game nyní tam žádná není) Vstupy (události myši) sleduje jiná třída (Input) Zachycené události předáme třídě Game Výstup (kreslení) necháme ve Form1 Třída Board se může při změně stavu desky sama nechat překreslit Přidáme vlastní událost do třídy Board Metoda MoveTile ji aktivuje při změně desky Program.Main napojí obsluhu této události na Form1 19/20

Poslední (dvacátý) slide jsem z této verze záměrně odstranil. Tak po něm nepátrejte. Celá tato přednáška byla zaměřena jen na řešení grafické části GUI, mnohé jiné věci byly tedy zjednodušeny nebo úplně opomenuty. Navíc cílem samozřejmě je, abyste si dámu naprogramovali sami ne abyste ji opsali ode mne. Obrázky k dámě pocházejí z programu guicheckers Jon Kreuzer, Josh Hess. Použito se svolením autora pro výukové účely na KMI. Mgr. Aleš Keprt, Ph.D., 2006,2007,2008 Vytvořeno pro potřeby přednášky na UP Olomouc. Tento text není určen pro samostudium, ale jen jako vodítko pro přednášku, takže jeho obsah se může čtenáři zdát stručný, nekompletní či možná i chybný. Použití je povoleno dle vlastní libosti, ale jen na vlastní nebezpečí. V případě dalšího šíření je NUTNO uvádět původního autora a odkaz na původní dokument. Komentáře můžete posílat e-mailem autorovi (adresu najdete přes Google).