Mathe für langsamen Bildzoom
Ich habe ein BMP-Bild mit einem Comic-Layout. Momentan funktioniert mein Code so. Wenn ich mit der rechten Maustaste klicke und die Maustaste gedrückt halte, kann ich einen Auswahlrahmen um einen der Rahmen auf der Comic-Seite zeichnen. Wenn ich die Taste loslasse, wird in diesen Rahmen hineingezoomt. Aber es ist sofort. Und ich möchte, dass es einen Animationseffekt hat.
Anstatt also die Werte von PicRect auf "END VALUE" zu setzen
PicRect.Left
PicRect.right
PicRect.top
PicRect.bottom
Wie im Code unten zu sehen ist, brauche ich eine Möglichkeit, um langsam dahin zu gelangen. Eine Art while-Schleife, die diese Werte ein wenig nach dem anderen setzt, bis sie den "Endwert" erreichen funktioniert. Auch versucht keine meiner while-Schleifen etwas anderes als zu weit hineinzuzoomen. Dies ist das Verfahren.
procedure TZImage.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var coef:Double;
t:integer;
begin
if FMouse=mNone then Exit;
if x>ShowRect.Right then x:=ShowRect.Right;
if y>ShowRect.Bottom then y:=ShowRect.Bottom;
if FMouse=mZoom then begin //calculate new PicRect
t:=startx;
startx:=Min(startx,x);
x:=Max(t,x);
t:=starty;
starty:=Min(starty,y);
y:=Max(t,y);
FMouse:=mNone;
MouseCapture:=False;
//enable the following if you want to zoom-out by dragging in the opposite direction}
{ if Startx>x then begin
DblClick;
Exit;
end;}
if Abs(x-startx)<5 then Exit;
if (x - startx < y - starty) then
begin
while (x - startx < y - starty) do
begin
x := x + 100;
startx := startx - 100;
end;
end
else if (x - startx > y - starty) then
begin
while (x - startx > y - starty) do
begin
y := y + 100;
starty := starty - 100;
end;
end;
//This is were it sets the zoom info. This is were
//I have to change to slowly get the PICRECT.Left/right/top/bottom
if (PicRect.Right=PicRect.Left)
then
coef := 100000
else
coef:=ShowRect.Right/(PicRect.Right-PicRect.Left);
PicRect.Left:=Round(PicRect.Left+startx/coef);
PicRect.Right:=PicRect.Left+Round((x-startx)/coef);
if (PicRect.Bottom=PicRect.Top)
then
coef := 100000
else
coef:=ShowRect.Bottom/(PicRect.Bottom-PicRect.Top);
PicRect.Top:=Round(PicRect.Top+starty/coef);
PicRect.Bottom:=PicRect.Top+Round((y-starty)/coef);
end;
if FMouse=mDrag then begin
FMouse:=mNone;
Canvas.Pen.Mode:=pmCopy;
Screen.Cursor:=crDefault;
end;
Invalidate;
end;
Ich glaube, dass dies im obigen Code getan werden kann. wollte aber auch diesen incase hinzufügen das hilft.
type
TZImage = class(TGraphicControl)
private
FBitmap : TBitmap;
PicRect : TRect;
ShowRect : TRect;
FShowBorder : boolean;
FBorderWidth : integer;
FForceRepaint : boolean;
FMouse : (mNone, mDrag, mZoom);
FProportional : boolean;
FDblClkEnable : boolean;
startx, starty,
oldx, oldy : integer;
Vielen Dank für jede Hilfe dabei, dies zum Laufen zu bringen.