C# - Több képet tartalmazó bittérkép felhasználása

forráskód letöltése
A .NET Framework ImageList osztályának segítségével nemcsak több képet tárolhatunk egy objektumban, de egy több-képes állományt is képesek vagyunk feldogozni, és a kép-lista kollekciójában egységenként kezelni. Ezt követően már indexszel hivatkozhatunk az egyes képekre. Cikkünkben ezt a lehetőséget ismerhetjük meg egy példán keresztül, ahol egy „legördülő” dialógusablakban jelennek meg a kép alkotói.
A példában a VÁLASZTÓABLAK feliratú nyomógombra kell kattintanunk, hogy „legördüljön” egy új dialógusablak, és ki tudjuk választani az ablakban megjelent 4 darab kép egyikét, melyek eredetileg a projekt mappájában található imagelist.bmp állomány részei. A választott kép pedig kirajzolódik a PictureBox kontrolban.
A legördülő ablak egy Form2 típusú objektum, melynek speciális beállításaival érhető el, hogy csak a négy kép méretével megegyező nagyságú terület legyen látható. A kezdeti értékek kirajzolása az Init metódusban történik, többek közt itt rajzoljuk ki a képeket a felületre.
A Show metódusban végezzük el a megjelenítést, a paraméterként kapott koordinátájú pontban.
public void Show(int x, int y)
{
  this.Left = x;
  this.Top = y;
  base.Show();
}
Az ESC billentyű lenyomásával, vagy más objektumra fókuszálva érhető el, hogy az ablak bezáródjon.
Az egér mozgatását kísérendő megváltoztatjuk az adott koordinátában található kép háttérszínét. Ezt az OnMouseMove metódusban végezzük el. Ha valamely kép fölött felengedjük a lenyomott egérgombot, akkor a kép megjelenik a PictureBox kontrolban.
Ekkor kiszámoljuk a kép sorszámát.
...
int image = coordY * columns + coordX;
Egy DataObject objektumban eltároljuk az ImageList komponens adott indexszel rendelkező képét.
DataObject d = new DataObject();
d.SetData(DataFormats.Text,image.ToString());
d.SetData(DataFormats.Bitmap,iList.Images[image]);
Majd amikor felengedjük a gombot, „elsütjük” a deklarált, ClickItemEventHandler típusú eseményt - ahol a kezelőfüggvény második paramétere hordozza a kép indexét - és elrejtjük a dialógusablakot.
if (ClickItem != null && imageId >=0 && imageId < iList.Images.Count)
{
  ClickItem(this, imageId);
  Hide();
}
Az alkalmazás főablakában induláskor fel kell töltenünk az ImageList komponenst „képekkel”. Egy fontos dologra kell odafigyelni: a forrás képnek a projekt részét kell képeznie, vagyis erőforrásként a projekthez kell adni, valamint hogy a kép szélessége egész szám szorosa legyen az ImageList komponensben megadott képszélességnek.
imageList1.ImageSize=new Size(32,32);
imageList1.ColorDepth = ColorDepth.Depth24Bit;
A megadott képméret 32 pixel, a forrásként használt bittérkép pedig 4*32, vagyis 128 pixel széles. Az ImageList osztály AddStrip metódusával bontjuk fel a képet részképekre, és fűzzük fel őket a listába.
imageList1.Images.AddStrip(new Bitmap(GetType(),"imagelist.bmp"));
...
A képekkel feltöltött ImageList objektumot átadjuk a Form2 objektum Init metódusának, majd létrehozunk egy kezelőmetódust a képre történő kattintáshoz.
f = new Form2();
f.Init(imageList1);
f.ClickItem += new Form2.ClickItemEventHandler(OnItemClicked);
Amikor a nyomógombra kattintunk, meghatározzuk a gomb helyzetét, majd a kapott koordinátát leképezzük a képernyő méreteire. Ezeket a koordinátákat adjuk át a Show metódusának.
Point pt = PointToScreen(new Point(button2.Left, button2.Bottom));
f.Show(pt.X,pt.Y);
A dialógusablak magasságát nulla értékre állítjuk.
f.Height = 0;
Majd elindítjuk az időzítőt.
timer1.Enabled = true;
timer1.Start();
Az időzítő pedig addig növeli a magasságot, amíg az el nem éri a teljes terjedelmet.
f.Height += 1;
A képek kiválasztásakor fut le a ClickItem esemény, melynek kezelőjében kiválasztjuk a választott sorszámú képet a listából.
pictureBox1.Image = imageList1.Images[item];