C# - Képet görgető Panel kontrol

forráskód letöltése
Amennyiben a Form felületén meg kell jelenítenünk egy képet, kézenfekvő, hogy a PictureBox kontrolt választjuk erre a célra. A PictureBox kontrol hátránya azonban, hogy a kontrol méreteit meghaladó kép megjelenítése esetén nincs lehetőség a tartalom görgetésére. Cikkünkben készítünk egy kontrolt, mely úgy jelenít meg egy képet, hogy a kép méreteitől függően megjelenik egy vízszintes, illetve egy függőleges görgetősáv, a tartalom részleteinek felfedéséhez.
A kontrol elkészítése
A kontrolunk a Panel osztályból származik. A kontrol konstruktorában beállítunk néhány megjelenítésre vonatkozó jellemzőt.
SetStyle(ControlStyles.UserPaint,true);
SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.AllPaintingInWmPaint,true);
A beálltások eredményeképpen a kontrol újrarajzolásakor nem tapasztalható vibrálás.
A kontrol rendelkezik egy vízszintes és egy függőleges görgetősáv objektummal, melyek akkor jelennek meg, ha a kép méretei meghaladják a kontrol méreteit. Létrehoztunk továbbá egy Image tagobjektumot a megjelenítendő kép számára. Hogy ezt szerkesztési időben is tudjuk módosítani, egy property-t is rendeltünk a kontrolhoz.
public Image Image
{
  get 
  {
    return image;
  }
  set
  {
    image = value;
    ...
  }
}
A kontrol OnPaint metódusában kirajzoljuk a kontrolt. Első lépésben kitöltjük a kontrol felületét a megfelelő kitöltő színnel.
g.FillRectangle(new SolidBrush(SystemColors.Control),ClientRectangle);
Amennyiben megadtunk képet, akkor kirajzoljuk az a Graphics osztály DrawImageUnscaled metódusával, mely a képet teljes terjedelmében jeleníti meg, függetlenül a kontrol méreteitől.
if (image != null)
{
  g.DrawImageUnscaled(image,-ox,-oy,image.Width,image.Height);
  ...
A kontrol kép kirajzolása alapértelmezésben a (0,0) pontba történik. A görgetést úgy érhetjük el, hogy a görgetősávok értékeit módosítva a rajzoló függvényben máshová rajzoljuk ki a kép-objektumot. A kirajzolási pozíció ox, és oy értékei függnek a görgetősávok aktuális értékétől.
Ezeket a görgetősávok Scroll eseményének kezelőmetódusában állítjuk be.
private void hScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
{
  ox = e.NewValue ;
  Invalidate();
}
Amikor a kép-objektumot megadjuk, meghívjuk a DoScrollBar metódust, melyben gondoskodunk a görgetősávok megjelenítéséről.
Alapértelmezésben kirajzoljuk a sávokat a megfelelő helyre, a Minimum property értékét nullára állítva.
hScrollBar1.SetBounds(0, ClientRectangle.Height - hScrollBar1.Height, ClientRectangle.Width - vScrollBar1.Width, hScrollBar1.Height);
vScrollBar1.SetBounds(ClientRectangle.Right - vScrollBar1.Width, 0, vScrollBar1.Width, ClientRectangle.Height - hScrollBar1.Height);
Amennyiben az Image property-ben nem adunk meg képet, a görgetősávok nem látszanak.
hScrollBar1.Visible = false;
vScrollBar1.Visible = false;
A görgetősávok láthatósága függ továbbá a kép méreteitől, vagyis csak azon az oldalon jelenítünk meg sávot, ahol a kép méretei túlnyúlnak a kontrolon.
hScrollBar1.Visible = (image.Width > Width) ? true : false;
vScrollBar1.Visible = (image.Height > Height) ? true : false;
Végül beállítjuk a görgetősávok maximum értékét.
hScrollBar1.Maximum = image.Width + vScrollBar1.Width*2 - ClientRectangle.Width;
vScrollBar1.Maximum = image.Height + hScrollBar1.Height*2 - ClientRectangle.Height;
Alkalmazás
Az alkalmazásban egyszerűen feldobjuk azt a Form felületére, amennyiben a kontrolt regisztráltuk a ToolBox-on, és a kontrol elintézi a teendőket. A kontrolunk egy, a kontrol méreteit jelentősen meghaladó képet jelenít meg.