Delphi - Zoom funkció megvalósítása

forráskód letöltése
A Delphi számtalan lehetőséget kínál a rajzolás területén. A Windows gdi32.dll dinamikusan szerkeszthető könyvtára tartalmazza azokat a metódusokat, melyek támogatást nyújtanak a különböző rajzfunkciók megvalósításában. Cikkünkben két metódus használatát vesszük górcső alá, mutatjuk be használatukat. Ezek a SetWindowExtEx és a SetViewportExtEx metódusok.
A metódusok deklarációit a Windows.pas állományban találhatjuk meg. A metódusok paramétereinek megismeréséhez nézzük meg az eredeti deklarációkat.
SetViewportExtEx
Osztály:
BOOL SetViewportExtEx(
HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize);
A metódus segítségével állíthatjuk be az adott rajzeszköz horizontális és vertikális kiterjedését.
Paraméterek
HDC hdc
A rajzeszköz azonosítója.
int nXExtent
Horizontális kiterjedés adható meg rajzolási egységben.
int nYExtent
Vertikális kiterjedés adható meg rajzolási egységben.
LPSIZE lpSize
Egy struktúrában megadhatók a korábbi kiterjedés adatai. A példánkban ez NIL.
Visszatérési érték
Sikeres végrehajtás esetén a visszatérési érték TRUE, egyébként FALSE.
SetWindowExtEx
Osztály:
BOOL SetWindowExtEx(
HDC hdc, int nXExtent, int nYExtent,
LPSIZE lpSize );
A metódus segítségével állíthatjuk be az adott ablak horizontális és vertikális kiterjedését.
Paraméterek
HDC hdc
Ablakazonosító.
int nXExtent
Horizontális kiterjedés.
int nYExtent
Vertikális kiterjedés.
LPSIZE lpSize
Egy struktúrában megadhatók a korábbi kiterjedés adatai. A példánkban ez NIL.
Visszatérési érték
Sikeres végrehajtás esetén a visszatérési érték TRUE, egyébként FALSE.
A két metódust felhasználhatjuk ahhoz, hogy a Form-ra rajzolt kép közelítésének mértékét befolyásoljuk, így mintegy zoom-olhatunk az adott képre.
A megoldáshoz létrehoztunk egy SetCZFactor nevű metódust, melynek első paraméterében adhatjuk át a rajzeszköz azonosítóját, jelen esetben a Canvas objektum azonosítóját, míg a második paraméterében a zoom-értéket 0 és 100 között.
procedure SetCZFactor(Canvas: TCanvas; AZoomFactor: Integer);
A metódusban meghívjuk a SetMapMode függvényt, melynek segítségével beállíthatjuk a léptéket a rajzoláshoz. Ha az adott zoom-érték 100, akkor a lépték az eredeti marad.
if AZoomFactor = 100 then
  SetMapMode(Canvas.Handle, MM_TEXT)
Else
Míg ha változik, akkor az MM_ISOTROPIC konstans segítségével módosítjuk azt.
begin
  SetMapMode(Canvas.Handle, MM_ISOTROPIC);
Majd két, fent deklarált metódust hívjuk meg, a SetWindowExtEx metódusnak átadva az új kiterjedéseket.
  SetWindowExtEx(Canvas.Handle, AZoomFactor, AZoomFactor, nil);
  SetViewportExtEx(Canvas.Handle, 100, 100, nil);
end;
A SetCZFactor metódus hívását a Draw függvénybe ágyaztuk, melyet a Form minden egyes újrafestésekor meghívunk. A metódusban betöltjük a mellékelt képállományt, beállítjuk a zoom mértékét, majd kirajzoljuk azt.
  bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+'telihold.bmp');
SetCZFactor(bitmap.Canvas, trackBar1.Position);
Canvas.Draw(20, 50, bitmap);
A példában a TTrackBar komponens Position property-jének aktuális értéke lesz a zoom mértéke.