Moin zusammen!
Ich hab vor, mir für mein neues Project einen kleinen Mapscreen für strategische Planungen
zu proggen. Funktioniert alles so ziemlich. Im Grunde kann ich die Karte jetzt per drag and Drop mit
der rechten Maustaste auf dem Form verschieben, und zusätzlich die karte nach allen Richtungen
scrollen. (Mauszeiger außerhalb des Forms) Allerdings finde ich meinen Code nicht gerade
super elegant und zweckgerichtet. *Ich denke Luckie wird sich erstmal an den Hals fassen und Aufschreien wollen*
Das Ganze basiert auf der Umrechnung von Globalen Maus Coords mit
der Maus-CLientcoords von Image1 und den Variablen Form1. left / with bzw. Form1. top / height.
Eines stört mich allerdings, wenn ich das Bild draggen will und ich komme mit dem mauszeiger über
die Fomulargrenzen hinaus, faengt er sofort an zu scrollen. ich will aber das er nur scrollt, wenn
keine maustaste gedrückt ist. Dazu muesste ich den Globalen Status der Maustasten abfragen koennen und
ich weis leider nicht wie. Bei den Globalen Coordinaten gibst dafür ja GetcursorPos, da ist das kein Problem.
Vielleicht hatt ja jemand einen ganz anderen viel eleganteren Loesungsweg in der Hinterhand
Waere nett wenn jemand Vorschläge haette. THX schonmal im vorraus.
Mein BeispielProject ist im Anhang
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg;
type
TForm1 =
class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
helper:boolean;
terrorx,terrory:Integer;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (mouse.cursorpos.x > form1.Left)
and (mouse.cursorpos.x < form1.Left+form1.width)
and
(mouse.CursorPos.y>form1.Top)
and (mouse.CursorPos.y < form1.top+form1.height)
And (helper=true)
then
begin
image1.left:=-terrorx+mouse.cursorpos.x-form1.left;
image1.top:=-terrory+mouse.cursorpos.y-form1.top;
end
else
begin
helper:=false;
//exit;
end;
if helper=false
then
begin
if (mouse.cursorpos.x<form1.Left)
and (image1.left<=30)
then image1.left:=image1.left+15;
if (mouse.cursorpos.x>form1.Left+form1.width)
and (image1.Left+image1.width>=form1.width-30)
then image1.left:=image1.left-15;
if (mouse.cursorpos.y<form1.top)
and (image1.top<=30)
then image1.top:=image1.top+15;
if (mouse.cursorpos.y>form1.top+form1.height)
and (image1.top+image1.height>=form1.height-59)
then image1.top:=image1.top-15;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssright
in shift
then
begin
terrorx:=+x+4;
terrory:=+y+30;
helper:=true;
end
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
helper:=false;
end;
end.
So long,
euer Richard
PS: bitte sein nachsichtig mit mir Luckie , der Code ist von heute früh 1.30 - 3.30 Uhr
//Edit Project ist leider zu Groß zu Hochladen ca. 8Mb, deswegen mal meine unit1.pas-datei
//Edit benoetigt werden ein TTimer und ein TImage, wobei das bild groeßer als das Form sein muss, sonst ist das ja kein Problem. hehe