Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika. Cserép Máté

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

BME MOGI Gépészeti informatika 14.

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

3. Beadandó feladat dokumentáció

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Grafikai lehetőségek

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

1. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája. Grafikus felületű alkalmazások architektúrája

A Paint program használata

Komponens alapú szoftverfejlesztés 8. előadás. Szoftver architektúrák alapvetései. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Programozás BMEKOKAA146. Dr. Bécsi Tamás 10. Előadás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

BME MOGI Gépészeti informatika 15.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

A szerzõrõl... xi Bevezetés... xiii

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája

2. Beadandó feladat dokumentáció

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Ugráló gomb oktatási segédlet Ugráló gomb

2. Beadandó feladat dokumentáció

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Programozási környezetek

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Cserép Máté

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

QGIS tanfolyam (ver.2.0)

BEÁGYAZOTT RENDSZEREK ALAPJAI. Grafikus benchmark alkalmazás

Vizuális programozás gyakorlat

VISUAL BASIC ALAPISMERETEK

Johanyák Zsolt Csaba: Képnézegető program oktatási segédlet

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Vizuális, eseményvezérelt programozás I.

2. Beadandó feladat dokumentáció

Új prezentáció létrehozása az alapértelmezés szerinti sablon alapján.

Programozási technológia

Eseményvezérelt alkalmazások fejlesztése I 3. előadás. Dinamikus felületű alkalmazások. Giachetta Roberto

Swing GUI készítése NetBeans IDE segítségével

Választó lekérdezés létrehozása

1. ábra Fájl feltöltése 2. ábra Megtekintés

BME MOGI Gépészeti informatika 7.

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Java és web programozás

VII. Appletek, grafika

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

RAJZ1. vezetett gyakorlat

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

Eseményvezérelt alkalmazások fejlesztése II 9. előadás. WPF erőforrások kezelése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Tartalom Képernyő részei... 2

BME MOGI Gépészeti informatika 6.

Access adatbázis elérése OLE DB-n keresztül

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Window Runtime specifikus alkalmazások megvalósítása. Giachetta Roberto

Thermo1 Graph. Felhasználói segédlet

Speciális szükségletű felhasználók navigációjának vizsgálata különböző multimédiás alkalmazásokban

3. Beadandó feladat dokumentáció

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

Java grafikai lehetőségek

Modell megvalósítása. Gregorics Tibor: Eseményvezérelt alkalmazások fejlesztése I.

Imagine Logo Tanmenet évfolyam

Rajz 01 gyakorló feladat

Képszerkesztés. Letölthető mintafeladatok gyakorláshoz: Minta teszt 1 Minta teszt 2. A modul célja

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Mesh generálás. IványiPéter

Képek és grafikák. A Beszúrás/Kép parancsot választva beszúrhatunk képet ClipArt gyűjteményből, vagy fájlból. 1. ábra Kép beszúrása

Az MS Word szövegszerkesztés modul részletes tematika listája

Mérési adatgyűjtés és adatfeldolgozás 2. előadás

Rajzoljunk a Flash programmal! FLASH ALAPOK I.

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Programozás I. Grafika Eseménykezelés. Programozás I. 2. gyakorlat Interakció a grafikus felületen, tagfüggvények. Surányi Márton PPKE-ITK

A LOGO MOTION TANÍTÁSA

DebitTray program Leírás

BME MOGI Gépészeti informatika 13.

Prezentáció. Kategória Tudásterület Hivatkozás Tudáselem 1. Az alkalmazás használata 1.1 Első lépések a prezentációkészítésben

1. beadandó feladat: egyszerű grafikus felületű alkalmazás. Közös követelmények:

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

BME MOGI Gépészeti informatika 4.

A Java nyelv. Dialógus ablakok. Elek Tibor

A MIMIO interaktív tábla használata. Dr. Boda István DRHE,

Operációs rendszerek. Tanmenet

Elemi Alkalmazások Fejlesztése Beadandó Feladat Juhász Ádám

ContractTray program Leírás

Concurrency in Swing

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

CAD-ART Kft Budapest, Fehérvári út 35.

Prezentáció, Diagramok, rajzolt objektumok. Szervezeti diagram

Bevezetés a QGIS program használatába Összeálította dr. Siki Zoltán

2. Beadandó feladat dokumentáció

Kedves versenyző, az alábbi feladatok illetve egy interneten kitöltendő teszt megoldására 90 perc áll rendelkezésedre.

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 3. előadás Windows Forms dinamikus felhasználói felület, elemi grafika Cserép Máté mcserep@inf.elte.hu http://mcserep.web.elte.hu Készült Giachetta Roberto jegyzete alapján http://www.inf.elte.hu/karunkrol/digitkonyv/

Vezérlők dinamikus kezelése Vezérlőket dinamikusan is létrehozhatunk, az alkalmazás futása közben a kódban létrehozott vezérlők tulajdonságait (pozíció, méret, felirat, ), valamint az eseménykezelő-társításokat ugyanúgy be tudjuk állítani a vezérlő csak akkor jelenik meg az ablakon, ha annak Controls listájában szerepel, ezért oda is fel kell vennünk, illetve törölnünk kell, ha le akarjuk venni az ablakról pl.: this.controls.add(mylabel); esetlegesen manuálisan is megsemmisíthető a vezérlő a Dispose( ) művelettel, de ez csak ritkán szükséges ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:2

Méretezés, elrendezések Annak érdekében, hogy a felület alkalmazkodjon az ablak méretéhez, vehetjük méreteit automatikusra (AutoSize, AutoSizeMode), továbbá lehetőségünk van, hogy különböző módon dokkoljuk őket (Dock) a tartalmazó vezérlőhöz A csoportosan létrehozott vezérlők elhelyezhető különböző elrendező elemek (pl. FlowLayoutPanel, TableLayoutPanel) segítségével ekkor a vezérlőt nem az ablak, hanem az elrendező gyerekelemeként helyezzük el Az elrendezők speciális módon szabályozhatóak (pl. TableLayoutPanel esetén megadható a sorok, illetve oszlopok méretezésének módja egyenként) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:3

Méretezés, elrendezések Pl.: Button mybutton = new Button(); mybutton.autosize = true; // automatikus méret mybutton.autosizemode = AutoSizeMode.GrowAndShrink; // csökkenhet is mybutton.dock = DockStyle.Fill; // kitöltés FlowLayoutPanel mypanel = new FlowLayoutPanel(); // folyamatos elrendező elem mypanel.flowdirection = FlowDirection.BottomUp; // alulról felfele elrendezés mypanel.controls.add(mybutton); // a gombot az elrendezőre vesszük fel ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:4

Feladat: Készítsünk egy dinamikus méretezhető táblát, amely véletlenszerű színre állítja a kattintott gombot, valamint a vele egy sorban és oszlopban lévőket. táblaelrendezést (TableLayoutPanel) használunk, amely tartalmazni fogja a gombrácsot, ügyeljünk arra, hogy a stílusokat is szabályoznunk kell a sorokban és oszlopokban a rács méretét külön szabályozhatjuk (NumericUpDown), mindig új, üres rácsot generálunk (a régit töröljük) a gombokat specializáljuk egy új típusba (GridButton), amely eltárolja annak rácsbeli koordinátáját is (GridX, GridY) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:5

Tervezés: GridButton - _x :Int32 - _y :Int32 Button + GridButton(Int32, Int32) «property» + GridX() :Int32 + GridY() :Int32 -_Buttons * GridForm - _random :Random - _buttons :GridButton ([,]) Form + GridForm() - ButtonSize_Click(object, EventArgs) :void - GridButton_Click(object, EventArgs) :void Program - Main() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:6

Megvalósítás (GridButton.cs): class GridButton : Button { // rácsgomb típusa, speciális gomb private Int32 _x; private Int32 _y; public Int32 GridX { get { return _x; } } public Int32 GridY { get { return _y; } } // lekérdezhetjük a rácsbeli pozíciót } public GridButton(Int32 x, Int32 y) { _x = x; _y = y; } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:7

Megvalósítás (GridForm.cs): void ButtonSize_Click(object sender, EventArgs e){ _buttons[i, j] = new GridButton(i, j); _buttons[i, j].backcolor = Color.White; _buttons[i, j].dock = DockStyle.Fill; // kitöltésre állítjuk _buttons[i, j].click += new EventHandler(GridButton_Click); // eseménykezelő társítás _tablelayoutgrid.controls.add( _buttons[i, j], j, i); // hozzáadjuk a táblapanel vezérlőihez ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:8

Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. a programban lehetőséget adunk új játék kezdésére, valamint lépésre (felváltva) a programban X és 0 jelekkel ábrázoljuk a két játékost a program automatikusan jelez, ha vége a játéknak (előugró üzenetben), majd automatikusan új játékot kezd lehetőséget adunk, hogy a felhasználó bármikor új játékot indítson az alkalmazás felületét gombok segítségével valósítjuk meg (9 játékgomb, valamint új játék kezdése) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:9

Tervezés: az alkalmazást kétrétegű architektúrában valósítjuk meg a modell (TicTacToeModel) egy mátrixban tárolja el a mezők állásait, a következő játékost és a lépésszámot felhasználunk egy felsorolási típust a mezők értékeire (Player) eseménnyel jelezzük a mező változását, játék végét és a győzelmet, és felhasználunk két speciális eseményargumentum típust (FieldChangedEventArgs, GameWonEventArgs), amelyek plusz információkat biztosítanak ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:10

Tervezés: - _currentplayer :Player - _gametable :Player ([,]) - _stepnumber :Int32 EventArgs Model::FieldChangedEventArgs + FieldChangedEventArgs(Int32, Int32, Player) «property» + Player() :Player + X() :Int32 + Y() :Int32 Model::TicTacToeModel + TicTacToeModel() + NewGame() :void + StepGame(Int32, Int32) :void - CheckGame() :void - OnGameWon(Player) :void - OnGameOver() :void - OnFieldChanged(Int32, Int32, Player) :void «property» + StepNumber() :Int32 «indexer» + this(int32, Int32) :Player «event» + GameWon() :EventHandler<GameWonEventArgs> + GameOver() :EventHandler + FieldChanged() :EventHandler<FieldChangedEventArgs> -_model Program - Main() :void - _model :TicTacToeModel - _buttongrid :Button ([,]) View::TicTacToeForm Form + TicTacToeForm() - GenerateTable() :void - SetTable() :void - Model_GameWon(object, GameWonEventArgs) :void - Model_GameOver(object, EventArgs) :void - Model_FieldChanged(object, FieldChangedEventArgs) :void - TicTacToeForm_Load(object, EventArgs) :void - TicTacToeForm_SizeChanged(object, EventArgs) :void - ButtonGrid_MouseClick(object, MouseEventArgs) :void -_currentplayer -_gametable 9 «enumerati... Model::Player NoPlayer PlayerX PlayerO EventArgs Model::GameWonEventArgs + GameWonEventArgs(Player) «property» + Player() :Player ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:11

Megvalósítás (TicTacToeModel.cs): public void StepGame(Int32 x, Int32 y) { _gametable[x, y] = _currentplayer; // pozíció rögzítése OnFieldChanged(x, y, _currentplayer); // jelezzük egy eseménykiváltással, hogy // változott a mező _stepnumber++; _currentplayer = _currentplayer == Player.PlayerO? Player.PlayerX : Player.PlayerO; // beállítjuk a következő játékost CheckGame(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:12

Megvalósítás (TicTacToeModel.cs): private void OnGameWon(Player player) { if (GameWon!= null) GameWon(this, new GameWonEventArgs(player)); } private void OnGameOver() { if (GameOver!= null) GameOver(this, EventArgs.Empty); } private void OnFieldChanged(Int32 x, Int32 y, ) { if (FieldChanged!= null) FieldChanged(this, new FieldChangedEventArgs(x, y, player)); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:13

Képek megjelenítése A képek kezelését a System.Drawing, illetve System. Drawing.Imaging névterek biztosítják támogatott képformátumok: BMP, GIF, JPEG, PNG, TIFF Az Image osztály az alapvető funkciókat biztosítja, pl.: megnyitás (Image.FromFile( ), Image.FromStream( )), mentés (Save( )), egyszerű manipulációk (RotateFlip( )), miniatűrkép lekérdezés (GetThumbnailImage( )) dimenziók lekérdezése (Width, Height, PixelFormat, Palette, ) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:14

Képek megjelenítése Ennél bővebb funkcionalitást biztosít a Bitmap osztály, pl. pixelszintű lekérdezést, írást (GetPixel( ), SetPixel( )) kép létrehozása méret, fájlnév, illetve másik kép alapján (átméretezéssel is) A képek több vezérlőn is megjeleníthetőek, pl. egyszerű címkén: Label mylabel = new Label(); Bitmap mybitmap = new Bitmap( ); // kép betöltése mylabel.size = new Size(myBitmap.Width, mybitmap.height); // címke átméretezése mylabel.image = mybitmap; // kép beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:15

Képek megjelenítése Alapvetően a képek megjelenítésére a PictureBox vezérlő szolgál, amely számos kényelmi funkciót biztosít, pl.: méretezés módja (SizeMode) kép betöltése lokális vagy távoli útvonalról (ImageLocation) hibakép (ErrorImage) Pl.: PictureBox mybox = new PictureBox(); mybox.image = mybitmap; // kép beállítása mybox.sizemode = PictureBoxSizeMode.StretchImage; // kép elnyújtása a vezérlő méreteinek // megfelelően ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:16

Erőforrások kezelése A programban felhasznált erőforrásokat (képek, hangok, ) célszerű a projekthez rögzíteni bármilyen fájl hozzáadható a projekthez tartalomként (content), vagy erőforrásként (embedded resource), és átmásolható a kimenti könyvtárba (az elem tulajdonságait szabályozva) az erőforrásfájlok (resource file) lehetővé teszik erőforrások (szöveg, kép, ikon) csoportos kezelését és programkódban történő elérését az így hozzáadott erőforrások elhelyeződnek az alkalmazásban alapértelmezetten a Properties\Resources.resx erőforrás fájlt használhatjuk, a tartalmakat a Properties.Resources útvonalon érjük el ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:17

Fájlrendszer-kezelés A fájlokkal és fájlrendszerrel kapcsolatos műveletek a System.IO névtérben helyezkednek el fájlműveleteket a File, könyvtárműveleteket a Directory osztály statikus műveleteivel hajthatunk végre, pl.: Directory.CreateDirectory(@"c:\Data"); // könyvtár létrehozása String[] paths = Directory.GetFiles(@"c:\Data"); // könyvtár listázása File.Copy(@"c:\data.txt", @"c:\data\data.txt"); // fájl másolása az elérési útvonallal kapcsolatos műveletek a Path osztályban találhatóak, pl.: Path.GetParent(@"c:\Data"); // szülő lekérdezése ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:18

Feladat: Készítsünk egy mozgókép megjelenítő alkalmazást, amelyben képek sorozatát tudjuk betölteni (mint képkockákat), és megjeleníteni azt animációként. Lehessen szabályozni az animáció sebességét, valamint lehessen látni, hogy a következő 1 másodpercben milyen képkockák jelennek meg. a felületnek lesz statikus, valamint dinamikus része (egy másodpercnek megfelelő képek) a képek megnyitásához könyvtárböngésző dialógust (FolderBrowserDialog) használunk eltároljuk a betöltött képeket (_images), valamint a generált címkéket (_pictureboxes), és időzítő segítségével fogjuk periodikusán cserélni őket ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:19

Tervezés: - _pictureboxes :PictureBox ([]) - _images :Image ([]) - _currentindex :Int32 - _timer :Timer MotionForm Form Program + MotionForm() - Timer_Tick(object, EventArgs) :void - LoadButton_Click(object, EventArgs) :void - ReloadPictureBoxes() :void - ReloadImages() :void - StartStopButton_Click(object, EventArgs) :void - NumericSmallImageCount_ValueChanged(object, EventArgs) :void - Main() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:20

Megvalósítás (MotionForm.cs): void LoadButton_Click(object sender, EventArgs e){ if (_folderbrowserdialog.showdialog() == DialogResult.OK) { // ha OK-val zárták le a dialógusablakot String[] files = Directory.GetFiles( _folderbrowserdialog.selectedpath, "*.jpg"); // könyvtár jpg kiterjesztésű fájljainak // listázása _images = new Image[files.Length]; // a képek száma megegyezik a fájlok // számával ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:21

Megvalósítás (MotionForm.cs): for (Int32 i = 0; i < files.length; i++) { try { _images[i] = Image.FromFile(files[i]); // kép betöltése } catch (ArgumentException) { // ha a fájl nem kép _images[i] = null; } } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:22

Megvalósítás (MotionForm.cs): private void ReloadPictureBoxes() { // kis képeket tartalmazó képmegjelenítők // cseréje _pictureboxes[i] = new PictureBox(); _pictureboxes[i].borderstyle = BorderStyle.FixedSingle; // keret _pictureboxes[i].sizemode = PictureBoxSizeMode.StretchImage; // nyújtás Controls.Add(_pictureBoxes[i]); // vezérlő felvétele ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:23

Windows Forms elemi grafika Rajzolási lehetőségek A grafikus felület lehetőséget biztosít 2D rajzolás végrehajtására, amelynek keretében egyszerű alakzatokat (vonal, kör, szöveg,...), vagy képeket rajzolhatunk bármely felületre az ablakunkban A rajzolással kapcsolatos tevékenységek a System.Drawing névtérben találhatóak a rajzolást a Graphics osztály metódusai biztosítják minden vezérlő (Control), valamint kép (Image) rajzolható a rajzolás az adott vezérlő koordinátarendezésben történik logikai koordináták szerint (élsimítással korrigálható) a rajzolásnál műveletenként adjuk meg a tulajdonságokat ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:24

Windows Forms elemi grafika Rajzeszközök A Graphics osztály példányosításával megadjuk a rajzfelületet, majd a következő módon rajzolhatunk: a DrawLine, DrawRectangle, DrawArc, műveletek az alakzatok körvonalát rajzolják meg toll (Pen) segítségével a FillRectangle, FillEllipse, FillPath, műveletek az alakzatok kitöltését rajzolják meg ecset (Brush) segítségével a DrawString művelettel rajzolhatunk szöveget a megadott betűtípussal (Font) és tollal a DrawImage művelettel rajzolhatunk képet a Clear művelettel törölhetjük a rajzfelületet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:25

Windows Forms elemi grafika Rajzfelület A rajzolási felület lehet: a direkt rajzolásra készített Panel típus rendelkezik egy Paint eseménnyel, amelynek eseményargumentumából lekérdezhető a rajzobjektum a panel frissítésével (Refresh( )) újra kiváltódik az esemény ugyanígy lekérhető az objektum a CreateGraphics() utasítással is bármely egyéb vezérlő a Graphics.FormHwnd( ) utasítással, amely paraméterben egy Control objektum Handle tulajdonságát kapja meg, pl.: Graphics g = Graphics.FromHwnd(myButton.Handle); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:26

Windows Forms elemi grafika Rajzfelület kép (Image), így lehetőségünk van a rajzolás háttérben való elvégzésére és kimentésére, ehhez a Graphics.FromImage( ) műveletet kell használnunk Pl.: Panel mypanel = new Panel(); // rajzpanel mypanel.paint += new PaintEventHandler(Panel_Paint); void Panel_Paint(object sender, PaintEventArgs e){ Graphics gr = e.graphics; // vagy mypanel.creategraphics(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:27

Windows Forms elemi grafika Színek, ecsetek, tollak A színezést a Color típus biztosítja alapértelmezett értékekkel (pl. Color.Blue), illetve tetszőleges, akár áttetsző szín létrehozásával (Color.FromArgb( )) a SystemsColors típus tartalmazza a rendszerszíneket A toll (Pen) a színen definiál vastagságot, stílust (pl. szaggatott, pöttyözött), valamint végpont típust (pl. lekerekített, nyíl) a Pens osztály tartalmazza az egyszerű tollakat Az ecset (Brush) a szín mellett speciális átmenettel, textúrával tudja ellátni a felületet, így különböző ecsettípusokat használhatunk (SolidColorBrush, TextureBrush, ) a Brushes osztály tartalmazza az egyszerű kitöltéseket ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:28

Windows Forms elemi grafika Színek, ecsetek, tollak Pl.: gr.fillrectangle(brushes.yellow, 0, 0, 200, 100); // narancs színű téglalap kitöltés Pen mypen = new Pen(Color.Red, 2); // 2 vastag piros toll mypen.dashstyle = BashStyle.Dot; // pontozott gr.drawrectangle(mypen, 0, 0, 200, 100); // szegély megrajzolása Brush mybrush = new LinearGradientBrush( new Point(0, 0), new Point(100, 100), Color.LightBlue, Color.LightRed); // átmenetes ecset gr.fillpolygon(mybrush, ); // sokszög kitöltés ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:29

Windows Forms elemi grafika Rajzeszköz beállítások A Graphics osztály további beállításokat biztosít: élsimítás a SmoothingMode tulajdonsággal (Default, HighSpeed, AntiAlias, ) koordinátarendszer módosítás a TranslateTransform( ), ScaleTransform( ), RotateTransform( ) műveletekkel (az összes utána lévő utasításra hat) állapotkezelés és váltás a Save( ) és Restore( ) műveletekkel, így visszakaphatjuk a korábbi koordinátarendszer beállításokat szövegkiterjedés mérése a MeasureString( ) művelettel rajzfelület vágása a SetClip( ), műveletekkel ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:30

Windows Forms elemi grafika Egérkezelés Az alapvető egérkattintás (Click) mellett számos, az egérrel kapcsolatos eseményt tudunk kezelni az alkalmazásban, pl.: egérgomb lenyomása (MouseDown), felengedése (MouseUp), amely során lekérdezhetjük a gombot (Button), valamint az aktuális egérpozíciót (X, Y) görgőmozgás (MouseWheel), amely során lekérdezhetjük a mozgatás mértékét (Delta) egér mozgása (MouseMove), amely során lekérhetjük az esetlegesen lenyomott gombot, és az egérpozíciót adott vezérlőn történő megjelenése (MouseEnter), mozgása (Hover) és eltávolodása (MouseLeave) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:31

Windows Forms elemi grafika Feladat: Készítsünk egy egyszerű rajzolóprogramot, amellyel alapvető alakzatokat tudunk egy felületre rajzolni. az alakzatok rögzítettek: zöld téglalap, piros ellipszis, egyenlő szárú sárga háromszög, az alakzat típusát rádiógombokkal tudjuk kiválasztani lehetőségünk lesz a rajz törlésére (gomb, vagy Delete billentyű segítségével), betöltésére és mentésére a rajzolás a bal egérgomb lenyomására történik, ekkor kék kerettel jelöljük az alakzatot, majd felengedéssel el is helyezzük azt a vásznon az alkalmazást modell/nézet architektúrában készítjük el ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:32

Windows Forms elemi grafika Tervezés: minden alakzat leírható befoglaló téglalap segítségével, ezért egy típusban (Shape) modellezzük őket megadva az alakzattípust (ShapeType) az alakzatokat egy képbe helyezzük (VectorImage), amely lehetőséget ad a szöveges fájlból történő betöltésre, mentésre, hozzáadásra és törlésre, illetve eseménnyel (ImageChanged) jelzi, ha változott a kép a nézetben (DrawingForm) feldolgozzuk a panel egér eseményeit, valamint az ablak billentyűzet eseményét, minden változáskor frissítjük a panelt, és újrarajzoljuk az elemeket (Panel_Paint) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:33

Windows Forms elemi grafika Tervezés: «enumeration» Model::ShapeType Rectangle Ellipse Triangle +Type() Model::Shape + Shape(ShapeType, Int32, Int32, Int32, Int32) «property» + Type() :ShapeType + StartX() :Int32 + StartY() :Int32 + Width() :Int32 + Height() :Int32 Program - Main() :void -_shapelist 0..* Model::VectorImage - _shapelist :List<Shape> + VectorImage() + VectorImage(String) + AddShape(ShapeType, Int32, Int32, Int32, Int32) :void + Clear() :void + Save(String) :void - Load(String) :void - OnImageChanged() :void «property» + Shapes() :IList<Shape> «event» + ImageChanged() :EventHandler -_image - _image :VectorImage - _startpoint :Point View::DrawingForm Form + DrawingForm() - MenuImageLoad_Click(object, EventArgs) :void - MenuImageSave_Click(object, EventArgs) :void - MenuImageClear_Click(object, EventArgs) :void - ButtonClear_Click(object, EventArgs) :void - Panel_Paint(object, PaintEventArgs) :void - Panel_MouseMove(object, MouseEventArgs) :void - Panel_MouseUp(object, MouseEventArgs) :void - Panel_MouseDown(object, MouseEventArgs) :void - DrawingForm_KeyDown(object, KeyEventArgs) :void - Image_ImageChanged(object, EventArgs) :void - DrawShape(Graphics, Shape) :void - DrawShape(Graphics, ShapeType, Int32, Int32, Int32, Int32) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:34

Windows Forms elemi grafika Tervezés: Panel Actor DrawingForm VectorImage MouseDown() Panel_MouseDown() MouseMove() DrawShape() Panel_MouseMove() MouseUp() DrawShape() Panel_MouseUp() AddShape() ImageChanged() Refresh() ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:35

Windows Forms elemi grafika Megvalósítás (DrawingForm.cs): private void Panel_Paint(object sender, PaintEventArgs e){ Graphics graphics = e.graphics; // rajzeszköz az eseményargumentumból foreach (Shape shape in _image.shapes) DrawShape(graphics, shape); // alakzatok kirajzolása } private void Image_ImageChanged( ){ _panel.refresh(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:36

Windows Forms elemi grafika Megvalósítás (DrawingForm.cs): private void DrawShape(Graphics graphics, Shape shape){ switch (shape.type) { case ShapeType.Rectangle: graphics.fillrectangle( Brushes.LightGreen, shape.startx, shape.starty, shape.width, shape.height); // kitöltés graphics.drawrectangle(pens.green, ); // keret break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:37

Windows Forms elemi grafika Feladat: Módosítsuk az előző programot úgy, hogy ne villogjon a képernyő sok alakzat esetén sem. a megoldás, hogy nem közvetlenül a képernyőre rajzolunk, hanem egy, a memóriában lévő képre (Bitmap) a képet kezdetben olyan színűre színezzük, mint a vezérlő (SystemColors.Control) minden alakzatot a képre rajzolunk, majd a képet egy lépésben kirajzoljuk a képernyőre (DrawImage), így az csak egyszer frissül mozgatás közben nem használjuk a frissítést, csupán egy lépésben kirajzoljuk a képet ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:38

Windows Forms elemi grafika Megvalósítás (DrawingForm.cs): private void Panel_Paint( ) { Bitmap bitmap = new Bitmap(_panel.Width, _panel.height); // kép létrehozása Graphics graphics = Graphics.FromImage(bitmap); // rajzeszköz a képre graphics.clear(systemcolors.control); // a vezérlő színére festjük a képet foreach (Shape shape in _image.shapes) DrawShape(graphics, shape); // alakzatok kirajzolása e.graphics.drawimage(bitmap, 0, 0); // kép kirajzolása a panelre } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:39

Windows Forms elemi grafika Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. a programban lehetőséget adunk új játék kezdésére, valamint lépésre (felváltva) a programban X és 0 jelekkel ábrázoljuk a két játékost a program automatikusan jelez, ha vége a játéknak (előugró üzenetben), majd automatikusan új játékot kezd lehetőséget adunk, hogy a felhasználó bármikor új játékot indítson (Ctrl+N billentyűzetkombinációra) az alkalmazás felületét elemi grafika segítségével valósítjuk meg ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:40

Windows Forms elemi grafika Tervezés: - _model :TicTacToeModel View::TicTacToeForm Form + TicTacToeForm() - Model_GameWon(object, GameWonEventArgs) :void - Model_GameOver(object, EventArgs) :void - Model_FieldChanged(object, FieldChangedEventArgs) :void - Panel_Paint(object, PaintEventArgs) :void - Panel_MouseDown(object, MouseEventArgs) :void - TicTacToeForm_KeyDown(object, KeyEventArgs) :void - TicTacToeForm_Load(object, EventArgs) :void - TicTacToeForm_Resize(object, EventArgs) :void -_model Model::TicTacToeModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:41

Windows Forms elemi grafika Megvalósítás (TicTacToeForm.cs): private void Panel_MouseDown(object sender, MouseEventArgs e) { // megállapítjuk, melyik mezőn van az egér Int32 x = 3 * e.x / _panel.width; Int32 y = 3 * e.y / _panel.height; } try { _model.stepgame(x, y); // lépünk a játékban } catch { } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:42

Windows Forms elemi grafika Megvalósítás (TicTacToeForm.cs): private void TicTacToeForm_KeyDown(object sender, KeyEventArgs e) { if (e.keycode == Keys.N && e.modifiers == Keys.Control) { // Ctrl+N esetén új játék indítása _model.newgame(); _panel.refresh(); } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 3:43