Merhabalar,
Çizim Programı tarzı birşey üzerinde çalışıyorum. Formumda bazı noktalar var. Fare bu noktalara 5px'den daha yakınsa GetCursorPos ile fareyi o noktaya götürüyorum. Kısacası bi çeşit mıknatıs özelliği var noktalarda.
Sorunum şurda ki; Fareyi bu noktadan kurtarmak için hızlı hareket ettirmem gerekiyor. Yani fareyi yavaş bir şekilde yana kaydırsam, farenin yeri değişmiyor çünkü hep o 5px'lik alanda kalıyor. Farenin kordinatlarını değilde, farenin hareketinin algılamamıza yaran bi yöntem bilen var mı acaba? Veya sorunumu çözmeye yardım edecek bir yol bilen? Teşekkür ediyorum.
Noktaya Göre Fare Hareketleri
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Noktaya Göre Fare Hareketleri
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
'Yükseldikçe küçülen bir uçurtma..'
Re: Noktaya Göre Fare Hareketleri
güzel bi soru 
şöyle olabilir.
mıknatıslı noktanın
mesela her soluna ilerlemeye çalışmasında atıyorum soldeneme diye bir değişkeni bir arttırsın peşpeşe 5 kez sola gitmeye çalıştığında setcursorpos ile noktanın 5-6 soluna taşırsın. böylece kullanıcı tarafından farkedilmeyecek bir iekilde noktadan kurtarmış olursun.

şöyle olabilir.
mıknatıslı noktanın
mesela her soluna ilerlemeye çalışmasında atıyorum soldeneme diye bir değişkeni bir arttırsın peşpeşe 5 kez sola gitmeye çalıştığında setcursorpos ile noktanın 5-6 soluna taşırsın. böylece kullanıcı tarafından farkedilmeyecek bir iekilde noktadan kurtarmış olursun.
Re: Noktaya Göre Fare Hareketleri
Dediğinizi yapamadım maalesef. Örnek kod mevcut mu acaba?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
'Yükseldikçe küçülen bir uçurtma..'
Re: Noktaya Göre Fare Hareketleri
fikir olsun diye söylüyorum.
fare noktaya yanasiyor mu, yoksa uzaklasiyor mu, bunu tespit ederek miknatis özelligini true veyahut false yapabilirsin.
yaklasiyorsa true olur ve 5px'e geldiginde cekim alanina girmis olur, hemen akabinde noktaya odaklanir.
uzaklasiyor ise, ki bu, varPos, CurPos ile saptanabilir (belki), o halde miknatis özelligi false olur ve cekim gerceklesmez.
kolay gelsin...
fare noktaya yanasiyor mu, yoksa uzaklasiyor mu, bunu tespit ederek miknatis özelligini true veyahut false yapabilirsin.
yaklasiyorsa true olur ve 5px'e geldiginde cekim alanina girmis olur, hemen akabinde noktaya odaklanir.
uzaklasiyor ise, ki bu, varPos, CurPos ile saptanabilir (belki), o halde miknatis özelligi false olur ve cekim gerceklesmez.
kolay gelsin...
kıdemsiz üye
Re: Noktaya Göre Fare Hareketleri
Beyin Jimnastiği olması açısından şöyle bir kod yazdım.qamyoncu yazdı:Dediğinizi yapamadım maalesef. Örnek kod mevcut mu acaba?
Hem mıknatıs özelliği hem de yavaş hareket olsa dahi alandan kurtulabilme özelliği içinde buyrun afiyet olsun.
Kod: Tümünü seç
unit fmain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,math;
Type
TMagnet = Record
MPoint: TPoint;
Movements : Trect;
End;
type
TForm1 = class(TForm)
xAlan: TImage;
procedure FormCreate(Sender: TObject);
procedure xAlanMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
MagnetPoints : array of TPoint;
CMagnet : TMagnet;
Procedure ResetCM;
public
{ Public declarations }
end;
const
MAGNET_DIM = 10;
var
Form1: TForm1;
Function Icinde(x, y, x1, y1, x2, y2: integer): Boolean;OverLoad;
Function Icinde(x,y:Integer; aRect : Trect):Boolean;OverLoad;
implementation
{$R *.dfm}
// Some Functions
Function Icinde(x, y, x1, y1, x2, y2: integer): Boolean;
Begin
Result := ((x >= min(x1, x2)) and (x <= max(x1, x2)) and (y >= min(y1, y2))
and (y <= max(y1, y2)));
End;
Function Icinde(x,y:Integer; aRect : Trect):Boolean;
Begin
Result:=Icinde(x,y,aRect.Left,aRect.Top,Arect.Right,aRect.Bottom);
End;
Procedure TForm1.ResetCM;
begin
with CMagnet do
Begin
MPoint := Point(-1,-1);
Movements := Rect(0,0,0,0);
End;
end;
// EOF Some Functions
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLEngth(MagnetPoints,10);
MagnetPoints[0] := Point(33,33);
MagnetPoints[1] := Point(99,99);
MagnetPoints[2] := Point(99,33);
MagnetPoints[3] := Point(33,99);
MagnetPoints[4] := Point(77,89);
MagnetPoints[5] := Point(177,189);
MagnetPoints[6] := Point(77,289);
MagnetPoints[7] := Point(377,89);
MagnetPoints[8] := Point(477,89);
MagnetPoints[9] := Point(77,589);
with xAlan do
Begin
Canvas.RectAngle(0,0,xAlan.Width,xAlan.Height);
Canvas.Polyline(MagnetPoints);
End;
end;
procedure TForm1.xAlanMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i : Integer;
aPoint : TPoint;
begin
for i := Low(MagnetPoints) to High(MagnetPoints) do
if Icinde (
x,y,
MagnetPoints[i].X-MAGNET_DIM,MagnetPoints[i].Y-MAGNET_DIM,
MagnetPoints[i].X+MAGNET_DIM,MagnetPoints[i].Y+MAGNET_DIM
)
then
Begin
CMagnet.MPoint :=MagnetPoints[i];
if (CMagnet.MPoint.X=-1) or (CMagnet.MPoint.Y=-1) then
Begin
ResetCM;
CMagnet.MPoint :=MagnetPoints[i];
End
else
Begin
if x<CMagnet.MPoint.X then inc(CMagnet.Movements.Left);
if Y<CMagnet.MPoint.Y then inc(CMagnet.Movements.Top);
if x>CMagnet.MPoint.X then inc(CMagnet.Movements.Right);
if Y>CMagnet.MPoint.Y then inc(CMagnet.Movements.Bottom);
End;
if
(CMagnet.Movements.Left>MAGNET_DIM) or
(CMagnet.Movements.Right>MAGNET_DIM) or
(CMagnet.Movements.Top>MAGNET_DIM) or
(CMagnet.Movements.Bottom>MAGNET_DIM) then
Begin
aPoint:=xAlan.ClientToScreen(Point(MagnetPoints[i].X,MagnetPoints[i].Y));
if (CMagnet.Movements.Left>MAGNET_DIM) then Dec(aPoint.X,Succ(CMagnet.Movements.Left))
else
if (CMagnet.Movements.Right>MAGNET_DIM) then Inc(aPoint.X,Succ(CMagnet.Movements.Right));
if (CMagnet.Movements.Top>MAGNET_DIM) then Dec(aPoint.Y,Succ(CMagnet.Movements.Top))
else
if (CMagnet.Movements.Bottom>MAGNET_DIM) then Inc(aPoint.Y,Succ(CMagnet.Movements.Bottom));
setCursorPos(aPoint.X,aPoint.Y);
ResetCM;
End
else
Begin
aPoint:=xAlan.ClientToScreen(Point(MagnetPoints[i].X,MagnetPoints[i].Y));
SetCursorPos(aPoint.X,aPoint.Y);
End;
Break;
End;
end;
end.
- Dosya ekleri
-
- Magnet.rar
- (7.64 KiB) 77 kere indirildi
Re: Noktaya Göre Fare Hareketleri
Teşekkür ediyorum @Lost Soul. Şuan delphi yüklü değil inceleyemiyorum ama bir sorun yok gibi. Sağ olun
@ikra;
Dediğiniz de güzel bir yöntem gibi fakat yeterince duyarlı olmuyor sanırım öyle. Çünkü fareyi soldan sağa çekerken fare noktamızın çekim alanına girdiğinde direk o noktaya gidecek. Fakat eğer kullanıcı fareyi sağa götürme işlemini devam ettirirse fare bizim istediğimiz noktadan çıkacak çünkü mıknatıs özelliği false olacak.

@ikra;
Dediğiniz de güzel bir yöntem gibi fakat yeterince duyarlı olmuyor sanırım öyle. Çünkü fareyi soldan sağa çekerken fare noktamızın çekim alanına girdiğinde direk o noktaya gidecek. Fakat eğer kullanıcı fareyi sağa götürme işlemini devam ettirirse fare bizim istediğimiz noktadan çıkacak çünkü mıknatıs özelliği false olacak.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
'Yükseldikçe küçülen bir uçurtma..'