RE:Zoom a la backimage de un TChar
Que tal, tengo algo, espero te sirva, puesdes hacer un "zoom", al hacer click dentro del chart y arrastrar el raton mientras tienes presionado el botón, se dibujará un rectángulo al soltar el botón sale un mensaje para confirmar que se quiere hacer el acercamiento, al darle que si te pondrá como BackImage la parte que has seleccionado del mismo chart, no se puede hacer zoom dentro de zoom, es decir, que si haces un zoom y luego otro haces otro este se hará en base a la imagen original, tendrias que darle al boton restaurar de la forma, necesitas un shape, un chart y un botón (el shape en su propiedad brush debe de tener: color=clwhite style=bsClear), no debes de cambiar el tamaño del chart en tiempo de ejecución, solo puedes hacerlo al crearse la forma por que si restauras la ventana se obtienen resultados inesperados, te puse una nota en el procedimiento de FormActivate,aqui te pego el codigo:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, Jpeg, StdCtrls;
type
TForm1 = class(TForm)
Chart1: TChart;
Shape1: TShape;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
imagen:Timage;
ImageBmp:TBitmap;
inix, iniy:integer;
pressed:boolean;
factorx, factory:real;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
//Form1.WindowState:=wsMaximized; //Puede o no ir esta linea
imagen:=TImage.Create(self);
imagen.Picture.LoadFromFile('c:\2.jpg');// NOTA aqui va el nombre de tu mapa
Chart1.BackImage.Assign(imagen.Picture);
ImageBmp:=TBitmap.Create;
ImageBmp.Assign(imagen.Picture.Graphic);
factorx:=imagen.Picture.Width/Chart1.Width;
factory:=imagen.Picture.Height/Chart1.Height;
pressed:=false;
imagen.Free;
Shape1.Visible:=false;
//ShowMessage(IntToStr(Chart1.Width)+' '+IntToStr(ImageBmp.Width)+' '+FloatToStr(factorx)+' '+FloatToStr(factory));
end;
procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape1.Left:=x;
Shape1.Top:=y;
inix:=x;
iniy:=y;
pressed:=true;
end;
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if pressed then begin
Shape1.Width:=x-inix;
Shape1.Height:=y-iniy;
Shape1.Visible:=true;
end;
end;
procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var ImageAux:TBitMap;
rectOrig,rectDest:TRect;
begin
pressed:=false;
Shape1.Visible:=false;
if MessageDlg('Hacer acercamiento?',mtConfirmation,[mbYes , mbNo],0)=mrYes then begin
ImageAux:=TBitmap.Create;
ImageAux.Width:=Trunc((X*factorx)-(inix*factorx));
ImageAux.Height:=Trunc((Y*factory)-(iniy*factory));
rectDest:=rect(0,0,ImageAux.width,ImageAux.height);
rectOrig:=rect(trunc(inix*factorx),trunc(iniy*factory),trunc(X*factorx),trunc(Y*factory));
ImageAux.Canvas.BrushCopy(rectDest,ImageBmp,rectOrig,clNone);
Chart1.BackImage.Assign(ImageAux);
ImageAux.Free;
end;
end;
procedure TForm1.FormClick(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
end;
end.