Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Cursor an Raster schnappen wie dieser Code ? (https://www.delphipraxis.net/128617-cursor-raster-schnappen-wie-dieser-code.html)

thomas2009 2. Feb 2009 22:33


Cursor an Raster schnappen wie dieser Code ?
 
Hallo

ich habe diesen Code getestet. Der Code zwingt den Cursor nur auf den raster zu bewegen :
http://www.codeproject.com/KB/system...splay=PrintAll

könnte man den Code in Delphi umwandeln ?

jaenicke 3. Feb 2009 00:58

Re: Cursor an Raster schnappen wie dieser Code ?
 
Ich sehe da auf die Schnelle keinen Befehl, den es in Delphi nicht direkt auch gibt. Insofern sollte das keine allzugroßen Schwierigkeiten bereiten.
Hast du es denn einmal versucht? ;-)

Union 3. Feb 2009 04:11

Re: Cursor an Raster schnappen wie dieser Code ?
 
Ich bin leider nicht bei Codeproject angemeldet und kann daher den Source nicht ansehen. Aber mit Delphi geht das einfach (schöner geht's immer):
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const
   GridSize = 10;
var
   NewPos : TPoint;
   Changed : boolean;
begin
   NewPos := Point(X, Y);

   if (X mod GridSize <> 0) then
   begin
      if (X mod GridSize) > GridSize div 2 then
         NewPos.X := X + GridSize - (X mod GridSize)
      else
         NewPos.X := X - (X mod GridSize);

      Changed := True;
   end;

   if (Y mod GridSize <> 0) then
   begin
      if (Y mod GridSize) > GridSize div 2 then
         NewPos.Y := Y + GridSize - (Y mod GridSize)
      else
         NewPos.Y := Y - (Y mod GridSize);
      Changed := True;
   end;

   if Changed then
   begin
      NewPos := ClientToScreen(NewPos);
      Mouse.CursorPos := NewPos;
   end;
   Label1.Caption := Format('%d/%d', [NewPos.X, NewPos.Y]);

jaenicke 3. Feb 2009 09:49

Re: Cursor an Raster schnappen wie dieser Code ?
 
Der Code bei CodeProject zeigt nur ein Gitter an und man bewegt eine Markierung am Gitter entlang, nicht die Mausposition selbst wird am Gitter ausgerichtet. ;-)

Das ist also sogar noch einfacher.

himitsu 3. Feb 2009 10:01

Re: Cursor an Raster schnappen wie dieser Code ?
 
is eigentlich auch schöner ... stell dir mal vor dir zieht ständig wer die Maus unter den Fingern weg ... nicht unbedingt schön zu steuern.


Das Einzige, was noch funktional wäre, wenn man den Mauszeiger unsichtbar macht und selber einen Zeiger ausgibt, diesen kann man dann auch etwas anders Positionieren, ohne daß die Maussteuerung verändert wird.

thomas2009 3. Feb 2009 14:04

Re: Cursor an Raster schnappen wie dieser Code ?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von Union
Ich bin leider nicht bei Codeproject angemeldet und kann daher den Source nicht ansehen. Aber mit Delphi geht das einfach (schöner geht's immer):

die Source ist aber nicht für Delphi (siehe Anhang )

Dein Code habe ich getestet aber der Cursor bleibt leider gebremst, nur man die Maus schnell bewegt

...
Zitat:

Zitat von jaenicke
Der Code bei CodeProject zeigt nur ein Gitter an und man bewegt eine Markierung am Gitter entlang, nicht die Mausposition selbst wird am Gitter ausgerichtet. ;-)

Das ist also sogar noch einfacher.

Hast du die Datei .exe getestet (siehe Anhang)

...
Zitat:

Zitat von himitsu
Das Einzige, was noch funktional wäre, wenn man den Mauszeiger unsichtbar macht und selber einen Zeiger ausgibt, diesen kann man dann auch etwas anders Positionieren, ohne daß die Maussteuerung verändert wird.

Es geht nicht nur um den Mauszeiger nur auf Raster zeigen zu lassen, sondern beim Zeichnen soll der Cursor an Gitter schnappen

himitsu 3. Feb 2009 14:55

Re: Cursor an Raster schnappen wie dieser Code ?
 
Zitat:

Zitat von thomas2009
Es geht nicht nur um den Mauszeiger nur auf Raster zeigen zu lassen, sondern beim Zeichnen soll der Cursor an Gitter schnappen

jupp, drum genauso, wie es in deiner Demo (SnapCursor.exe) ist,
nur daß du jetzt noch den richtigen Mauszeiger unsichtbar machst und stattdessen an der gewünschten Position einen eigenen Zeiger zeichnest.

unsichtbar: Cursor = crNone

Zitat:

Dein Code habe ich getestet aber der Cursor bleibt leider gebremst, nur man die Maus schnell bewegt
genau deswegen nicht den "echten" Mauszeiger in Real verschieben, sondern diesen nur virtuell verschieben.

_frank_ 5. Feb 2009 10:25

Re: Cursor an Raster schnappen wie dieser Code ?
 
mal fix zusammengetippt:
Delphi-Quellcode:
TForm1 = class(TForm)
...
  private
    { Private-Deklarationen }
    oldrect:Trect;
...
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const
  gridwidth=10;
begin
  canvas.Pen.Mode:=pmXOR;
  canvas.Pen.color:=clBlue xor $FFFFFF; //xor damit die markierung auch wirklich blau wird
  canvas.Brush.Style:=bsClear; //keine füllung
  if oldrect.Left<>-1 then //altes Rechteck erst einmal löschen
  begin
    canvas.Rectangle(oldrect.left,oldrect.top,oldrect.right,oldrect.bottom);
  end;
  oldrect.left:=(x div gridwidth)*gridwidth;
  oldrect.top:=(y div gridwidth)*gridwidth;
  oldrect.Right:=oldrect.Left+gridwidth;
  oldrect.Bottom:=oldrect.Top+gridwidth;
  canvas.Rectangle(oldrect.left,oldrect.top,oldrect.right,oldrect.bottom);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  oldrect:=rect(-1,-1,-1,-1);
  cursor:=crNone;
end;
lässt sich evtl noch optimieren, aber ist ja nur ein beispiel.

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz