Переміщення курсору по сітці
Вітаю! Підкажіть, будь ласка, як реалізувати переміщення курсору в TImage тільки вузлами сітки, наприклад, як у AutoCAD чи PCAD? Дякую.
Ймовірно, фіксовано встановлювати позицію курсора на onMouseMove
Приклад рішення "в лоб"
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; процесу Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private LastCoord:TPoint; //останні координати курсору в термінах //TImage public < Public declarations > end;
var Form1: TForm1;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var XDisplacement, YDisplacement:Double; begin іf (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); (YDisplacement+1) *YStep);// SetCursorPos((Sender as TImage).ClientOrigin.X+X; LastCoord.X:=X; LastCoord.Y:=Y; end;
To Forester: немає в мене і в help про sign, але якщо це знак числа – тоді я правильно зрозумів і Ваш приклад працює не так, тобто. при малому зрушенні миші переміщає курсор на одиницю сітки, а треба так: миша проповзає n-піксел і потім курсор перескакує до наступного вузол сітки.
>>треба так: миша проповзає n-піксел і потім курсор >>перескакує в наступний вузол сітки.
Тоді це не зовсім як уAutoCad. Там миша пересувається точно вузлами. Але якщо треба саме так, то зроби перевірку на величину дрібної частини XDisplacement, YDisplacement. 0.5 – зміщення курсору на половину осередку сітки.
>>немає у мене і в help про sign
Напевно, є в описі модуля Math. Це справді визначення знака.
To Forester: млинець, завантажив AutoCAD перевірити (думав, а вже щось забув, але ні). Напевно, просто погано пояснив: миша проповзає n-піксел по килиму, а не по екрану. Не знаю, як це називається, але наприклад в Paint миша по екрану ходить на 1 піксел = стільки ж і по килиму (утрировано). А в AutoCAD вона повзе по килиму якусь відстань, залишаючись нерухомо у вузлі сітки, а потім перескакує на наступний. Це дуже помітно при збільшенні, коли на екрані крок сітки розміром дек. див. Мені здається, що Cobalt ділову думку дав, просто реалізувати поки що ніколи.