ich bin dabei ein Objekt in der Größe zu andern, aber die Größenänderung funktioniert nicht wie beabsichtigt. Ich habe eine externe Grafikbibliothek dazu benutzt, hier soll es aber erst mal um die Berechnung der Koordinaten gehen, vielleicht sieht hier jemand meinen Rechenfehler, dann muss das Programm keiner von Euch am eigenen Rechner ausprobieren und braucht dann auch die Grafikbibliothek nicht.
Code: Alles auswählen
program Resizetest;
uses
sysutils,classes,
vipgfx,vis,tools; //Grafikroutinen
var
pic,sprt,buffer:gfxImage; //temporäre Bildschirmpuffer
x,y,oldx,oldy,dx,dy: Integer; //temporäre Variablen zum Halten der akt. Mausposition
//Eigene Variablen definiert da ich unabhängig von der LCL programmiert habe
//Muss ja auch funktionieren, will das hinbekommen ohne LCL, persönlicher Ehrgeiz!
ButtonUp, //Maustaste losgelassen?
ButtonDown: Boolean; //Maustaste gedrückt?
type
{ TResizeable }
TResizeable = class(TComponent)
private
FStartX: Integer;
FStartY: Integer;
FDeltaX: Integer;
FDeltaY: Integer;
FStartPosValid: Boolean;
FRect: TRect;
public
constructor Create(AOwner: TComponent);
procedure MouseDown(X,Y: Integer);
procedure MouseMove(X,Y: Integer);
procedure MouseUp();
procedure Paint;
property StartX: Integer read FStartX;
property StartY: Integer read FStartY;
property DeltaX: Integer read FDeltaX write FDeltaX;
property DeltaY: Integer read FDeltaY write FDeltaY;
Property Rect: TRect read FRect write FRect;
end;
{ TResizeable }
constructor TResizeable.Create(AOwner: TComponent);
begin
inherited Create (AOwner);
FStartPosValid := false;
FRect.Left := 10; FRect.Right := 300;
FRect.Top := 10; FRect.Bottom := 200;
end;
procedure TResizeable.MouseDown(X, Y: Integer);
begin
if mouseL then
if not FStartPosValid then
begin
FStartX := X;
FStartY := Y;
FStartPosValid := true;
ButtonDown := true;
ButtonUp := false;
end;
end;
procedure TResizeable.MouseMove(X, Y: Integer);
begin
if mouseL then
begin
FDeltaX := X - FStartX;
FDeltaY := Y - FStartY;
FRect.Right := FRect.Right + FDeltaX; FRect.Bottom := FRect.Bottom + FDeltaY;
Paint; //Hier soll das in der Größe veränderte Rechteck gezeichnet werden
end;
end;
procedure TResizeable.MouseUp();
begin
if not mouseL then
begin
FStartPosValid := false;
ButtonDown := false;
ButtonUp := true;
end;
end;
procedure TResizeable.Paint;
begin
DrawBarClip(vscreen, //Zeichne direkt in den Bildschirm
Rect.Left,Rect.Top,Rect.Right,Rect.Bottom, //der Rechteckbereich
RGBA(0,255,255,255) //die Farbe
);
end;
var
Widget: TResizeable;
begin
jpegLoad(pic,'pic.jpg'); //Lade Hintergrundbild
InitGFXSystem(800,600,false);
initInputSystem(gfxInputMessanger);
setGFXwindowPos(200,100);
getGFXwindowPos(x,y);
logwrite(numstr(x));
setWindowCaption('test');
Widget := TResizeable.Create(nil);
Widget.Paint;
oldx := mousex; oldy := mousey;
repeat
dx := oldx - mousex;
dy := oldy - mousey;
Oldx:=mousex;
Oldy:=mousey;
if not ButtonUp then
begin
x := x - dx;
y := y - dy;
end;
//Die obigen Berechnungen führen leider nicht zum Erfolg
Widget.MouseDown(mousex,mousey); //mousex, mousey sind in der Grafikbibliothek enthalten und
Widget.MouseMove(mousex,mousey); //zeigen auf die aktuelle Mauszeigerposition
Widget.MouseUp;
//Eine Prozedur aus der Grafikbibliothek die ein Bild oder Sprite
//vorgegebener Größe auf den Bildschirm zeichnet
//Kann auch Sprites kleiner als der Bildschirmbereich zeichnen,
//wenn das Sprite vorher mit DrawBarClip() in der Größe festgelegt,
//aber in einen Bildpuffer gezeichnet wurde, dessen Inhalt dann mit
//PutSpriteClip ausgegeben wird
putspriteclip(vscreen,x,y,pic,RGBA(255,0,255,255)); //Hintergrundbild auf Bildschirm
//Aber nachdem das Rechteck gezeichnet wurde
//Grafikbibliothekspezifische Tastaturabfrage
if keyboard[VK_SPACE] then begin minimizeGFXwindow; keyboard[VK_SPACE]:=false; end;
if keyboard[VK_F11] then begin switchWindowed; keyboard[VK_F11]:=false; end;
if keyboard[VK_F12] then begin switchFullScreen;keyboard[VK_F12]:=false; end;
//getGFXwindowPos(x,y);
updateGFXsystem;
updateInputSystem(gfxMessanger);
until gfxDone or keyboard[VK_ESCAPE];
//Hier noch paar vipgfx spezifische Freigaben die für mein Problem irrelevant sind
finishGFXsystem;
closeInputSystem;
freeimage(pic);
freeimage(sprt);
ReturnFPSstring;
end.