Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.19;
Скачать: CL | DM;

Вниз

Перемещение курсора по сетке   Найти похожие ветки 

 
Navi ©   (2003-05-31 08:03) [0]

Здравствуйте!
Подскажите, пожалуйста, как реализовать перемещение курсора в TImage только по узлам сетки, например как в AutoCAD или PCAD?
Спасибо.


 
Song ©   (2003-05-31 10:14) [1]

Вероятно фиксировно устанавливать позицию курсора на onMouseMove


 
Cobalt ©   (2003-05-31 10:38) [2]

2 Song © (31.05.03 10:14)
Теперь при одном движении мышки курсор будет делать в 7 раз больше!!! :)
2 Navi © (31.05.03 08:03)
Отслеживай onMouseMove и считай дельты от текущего положения(суммируй), а сам курсор устанавливай обратно. Как только сумма дельт перевалит за половину высоты сетки перемещай курсор.


 
Forester ©   (2003-05-31 11:14) [3]

Пример решения "в лоб"

unit UMMove;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, Math;

const
XStep = 10; //шаг сетки по X
YStep = 10; //шаг сетки по Y

type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
LastCoord:TPoint; //последние координаты курсора в терминах
//TImage
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
XDisplacement, YDisplacement:Double;
begin
if (X=LastCoord.X) and (Y=LastCoord.Y) then
exit;
XDisplacement:=(X-LastCoord.X) / XStep;
YDisplacement:=(Y-LastCoord.Y) / YStep;
X:=LastCoord.X+round(sign(XDisplacement)*Abs(XDisplacement+1)
*XStep);//
Y:=LastCoord.Y+round(sign(YDisplacement)*Abs(YDisplacement+1)
*YStep);//
SetCursorPos((Sender as TImage).ClientOrigin.X+X,
(Sender as TImage).ClientOrigin.Y+Y);
LastCoord.X:=X;
LastCoord.Y:=Y;
end;

end.



 
Navi ©   (2003-06-01 08:09) [4]

To Forester: нет у меня и в help про sign, но если это знак числа - тогда я правильно понял и Ваш пример работает не так, т.е. при малом сдвиге мыши перемещает курсор на единицу сетки, а надо так: мышь проползает n-пиксел и потом курсор перескакивает в следующий узел сетки.


 
Forester ©   (2003-06-01 08:58) [5]

>Navi

>>надо так: мышь проползает n-пиксел и потом курсор >>перескакивает в следующий узел сетки.

Тогда это не совсем как в AutoCad. Там мышь передвигается точно по узлам. Но если надо именно так, то сделай проверку на величину
дробной части XDisplacement, YDisplacement. 0.5 - смещение курсора на половину ячейки сетки.

>>нет у меня и в help про sign

Наверняка есть, в описании модуля Math. Это действительно определение знака.


 
Navi ©   (2003-06-07 07:51) [6]

To Forester: блин, загрузил AutoCAD проверить (думал а уж что-то забыл, но нет). Наверно просто плохо объяснил: мышь проползает n-пиксел по ковру, а не по экрану. Не знаю, как это называется, но например в Paint мышь по экрану ходит на 1 пиксел=столько-же и по ковру (утрированно). А в AutoCAD она ползет по ковру какое-то расстояние, оставаясь неподвижно в узле сетки, а за тем перескакивает на следующий. Это очень заметно при увеличении, когда на экране шаг сетки размером неск. см. Мне кажется, что Cobalt дельную мысль дал, просто реализовать пока некогда.



Страницы: 1 вся ветка

Текущий архив: 2003.06.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-60150
Zew
2003-06-04 18:19
2003.06.19
через определённое время прибавлять число


1-60220
aleman
2003-06-05 13:48
2003.06.19
Как рассчитать синус и косинус?


14-60385
comintegrator
2003-06-02 23:14
2003.06.19
ШИФРОВАНИЕ


7-60441
DV
2003-04-15 16:51
2003.06.19
Еще раз про ком-порт


3-60043
sts
2003-05-27 15:12
2003.06.19
master-detail