hiho,
als wir in der Schule unser Navi programmiert haben, haben wir sowas auch gebraucht. Wir haben das bisschen anders gelöst. Wir haben eine Karte in ein Image geladen und mit copyrect in ein anderes kopiert. Ist jetzt nicht unbedingt der sauberste code, aber es hat funktioniert
Hierbei haben wir dann jeweils den Zoom um 30 Pixel in jede Richtung verwirklicht. Für dich dürfte Faktorx und faktory am wichtigsten sein.
Delphi-Quellcode:
Map: TImage;
rectkopie,recteinf:Trect;
MMX,MMY,MX,MY,track,zentrpos:integer;
//zoomfaktor
function faktorx(trackbarposition,image1width:integer):extended;
begin
faktorx:=(60*(10-trackbarposition)+ image1width) / (image1width);
end;
//zoomfaktor
function faktory(trackbarposition,image1height:integer):extended;
begin
faktory:=(60*(10-trackbarposition)+ image1height) / (image1height);
end;
procedure punktsetzen(faktx,fakty:extended);
begin
with form1 do begin
map.canvas.ellipse((trunc(MX*faktx)+rectkopie.left-5),
(trunc(MY*fakty)+rectkopie.top-5),
(trunc(MX*faktx)+rectkopie.left+5),
(trunc(MY*fakty)+rectkopie.top+5 ));
end;
end;
procedure zoomin;
begin
with form1 do begin
rectkopie.top:=rectkopie.top+30;
rectkopie.bottom:=rectkopie.bottom-30;
rectkopie.left:=rectkopie.left+30;
rectkopie.right:=rectkopie.right-30;
end;
end;
procedure zoomout;
begin
with form1 do begin
if rectkopie.top-30<0 then
rectkopie.bottom:=rectkopie.bottom+60
else
begin
if rectkopie.bottom+30>1283 then
rectkopie.top:=rectkopie.top-60
else
begin
rectkopie.bottom:=rectkopie.bottom+30;
rectkopie.top:=rectkopie.top-30;
end;
end;
if rectkopie.left-30<0 then
rectkopie.right:=rectkopie.right+60
else
begin
if rectkopie.right+30>2790 then
rectkopie.left:=rectkopie.left-60
else
begin
rectkopie.right:=rectkopie.right+30;
rectkopie.left:=rectkopie.left-30;
end;
end;
end;
end;
procedure rechteckverschiebung;
begin
with form1 do begin
rectkopie.top:=rectkopie.top+(MMY);
rectkopie.bottom:=rectkopie.bottom+(MMY);
rectkopie.left:=rectkopie.left+(MMX);
rectkopie.right:=rectkopie.right+(MMX);
end;
end;
procedure randabfrage;
begin
with form1 do begin
if rectkopie.top+MMY<0 then
if MMY<0 then MMY:=0;
if rectkopie.bottom+MMY>1283 then
if MMY>0 then MMY:=0;
if rectkopie.left+MMX<0 then
if MMX<0 then MMX:=0;
if rectkopie.right+MMX>2790 then
if MMX>0 then MMX:=0;
end;
end;
procedure anzeigeaktualisieren;
begin
with form1 do
anzeige.canvas.copyrect(recteinf,map.canvas,rectkopie);
end;
und dann beim Trackbar-Change
Delphi-Quellcode:
procedure TForm1.ZoomChange(Sender: TObject);
var
i:integer;
begin
//Abfrage ob zoom-out
if zoom.position-track<0 then
begin
//Wenn die veränderung größer als 1 ist, dann wird auch mehr als einmal gezoomt.
for i:=0 to track-zoom.Position-1 do
begin
//Zoom Out
zoomout;
//Anzeige Aktualisierung
anzeigeaktualisieren;
end;
end
else
//Abfrage ob Zoom-in
if zoom.position-track>0 then
begin
//Wenn die veränderung größer als 1 ist, dann wird auch mehr als einmal gezoomt.
for i:=0 to zoom.Position-track-1 do
begin
//Zoom-In
zoomin;
//Anzeige aktualisieren
anzeigeaktualisieren;
end;
end;
track:=zoom.position;
end;