Annak elkerülésére, hogy ugyan azt a kódot minden alkalmazásba le kelljen írni, dll-eket hozunk létre, amiket majd csak hozzá kell adnunk a megfelelő projekt referenciáihoz.
A következő projekt, amit létrehozunk egy WPF Toolbox Control. Ehhez szükség van a Visual Studio 2012 SDK-ra.
Azért választottam a Toolbox Control-t, mert így a Visual Studio készít egy ProjektNév.vsix fájlt. Ennek a segítségével az elkészített User Control-ok bekerülnek a toolbox-ba, így könnyebben használhatóak.
Két User Controlra lesz szükségünk. Az egyik felelős a színes képek megjelenítéséért és mentéséért, a másik a Joint távolságokhoz kell.
Amikor egy új User Controlt adunk hozzá a projekthez, akkor két fájl jön létre. Az egyik egy xaml fájl, ami a felületet írja le, a másik a xmal-hez tartozó partial class.
Az első User Control a SaveImage, amely megjeleníti és menti a korábban létrehozott osztályokat (RgbImage, DepthImage, SkeletonImage). A felülete nagyon egyszerű, egyetlen Image-ből áll. Fontos , hogy nevezzük el magát a keretet, mert szükségünk lesz a méreteire. Az osztályban szükség van egy ImageSize metódusra és három Source metódusra, amelyek csak paramétereikben térnek el. A feladatuk, hogy a felületen elhelyezett Image forrását beállítsák és meghívják az ImageSize metódust. Az ImageSize beállítja a kép méretét a befoglaló keret méreteire. Így ha majd az új projektben, amikor felhasználjuk az Image-et a toolbox-ból, akkor változtatható lesz a mérete, hiszen az Image mérete a keret méretével változik. A következő metódus készíti el a fényképet, és menti az asztalra:
public void foto() { DrawingVisual dv = new DrawingVisual(); DrawingContext dc = dv.RenderOpen(); dc.DrawImage(myImage.Source, new Rect(0, 0, myImage.Width, myImage.Height)); dc.Close(); RenderTargetBitmap rtb = new RenderTargetBitmap( (Int32)myImage.Width, (Int32)myImage.Height, 96, 96, PixelFormats.Default); rtb.Render(dv); BitmapEncoder bme = new PngBitmapEncoder(); bme.Frames.Add(BitmapFrame.Create(rtb)); string time = System.DateTime.Now.ToString("hh'-'mm'-'ss", CultureInfo.CurrentUICulture.DateTimeFormat); string myPic = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string path = System.IO.Path.Combine(myPic, "newPic-" + time + ".png"); try { using (FileStream fs = new FileStream(path, FileMode.Create)) { bme.Save(fs); } } catch (IOException exc) { MessageBox.Show(exc.Message); } }
A második User Control a távolságok megjelenítésében fog segíteni. A feladata, hogy a egy felületen elhelyezett képen be lehessen jelölni a Joint-okat, és hogy kiírja a kijelölt Joint-ok távolságát a szenzortól.
A felület tehát tartalmazza a képet. Minden Joint-ra el kell helyezni egy-egy ellipszist és textbox-ot, megfelelően elnevezni és egy eseménykezelőt adni hozzá.
Az osztályban három adattag található. Egy példány a Distance osztályból, egy JointType-okat tartalmató lista, és egy bool segédváltozó. Minden eseménykezelő feladata az, hogy megvizsgálja az ellipszis színét. Ha fehért, akkor megváltoztatja sárgára és behelyezi a listába, ha sárga, akkor fehérre színezi és törli a listából.
A másik metódusa a GetDistance, amelynek az a feladata, hogy az összegyűjtött listát átadja a Distance osztály GetDistances metódusának és feldolgozza a kapott listát. Vagyis menjen végig a kapott listán egy foreach-el és a megfelelő Joint-okhoz tartozó szövegdobozba írja ki a távolságot.
Egyenlőre ennyi lenne az elkészített eszköztár, de a dolgozat előrehaladtával folyamatosan bővülni fog.
Üdvözlettel: Álb Csaba