Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
Delphi XE2 Professional
|
Re: Rechtsklick-Scrolling
22. Jun 2008, 17:47
So, endlich hinbekommen. Auch wenn es etwas schwer aus dem Zusammenhang zu bekommen ist - hier ist die Lösung:
Delphi-Quellcode:
VScroll: TPoint;
TInputState = (isRightClickScroll);
TInputStates = set of TInputState;
{....}
procedure TEngine.Mousedown(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
var
pt: TPoint;
begin
if Button = mbRight then // Nur bei rechter Maustaste
begin
InputState := InputState + [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling an ist
pt := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
SetCursorPos(pt.X, pt.Y); // Cursor auf Mitte zentrieren
end;
end;
procedure TEngine.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
begin
if Button = mbRight then
begin
InputState := InputState - [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling aus ist
VScroll := Point(0, 0); // Scrollingversatz zurücksetzen
end;
end;
procedure TEngine.MouseMove(X, Y: integer);
Center, RealPoint: TPoint;
begin
if isRightClickScroll in InputState then
begin
// Mitte ermitteln
Center := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
// Tatsächliche Mausposition ermitteln
RealPoint := Point(AParent.ClientOrigin.X+X,AParent.ClientOrigin.Y+Y);
// Anstand in "Vektor" speichern (hier TPoint zweckentfremdet
VScroll.x := VScroll.X + (Center.X - RealPoint.X);
VScroll.y := VScroll.Y + (Center.Y - RealPoint.Y);
end;
procedure TEngine.DoScroll(TimeGap: double);
var
Center: TPoint;
begin
if isRightClickScroll in InputState then
if (VScroll.X <> 0) or (VScroll.Y <> 0) then // Nur ausführen, wenn auch Versatz da ist
begin
// Entsprechend des Versatzes scrollen
SpriteEngine.X := SpriteEngine.X + VScroll.X;
SpriteEngine.Y := SpriteEngine.Y + VScroll.y;
// Es wurde gescrollt, also Vektor zurücksetzen
VScroll.x := 0;
VScroll.Y := 0;
// Cursor wieder auf Mitte festhalten
Center:=Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
SetCursorPos(Center.X, Center.Y);
Exit;
end;
end;
Kann man sicherlich noch verschönern, aber sollte für den Anfang reichen
Thomas
|
|
Zitat
|