Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2008, 18:05   #1
nevo
 
Регистрация: 04.04.2008
Сообщений: 8
По умолчанию Движение указателя по форме или Image

Надо чтоб указатель двигался с привязкой к точкам (допустим ч/з каждые 50точек), как по координатной сетке (например как в AutoCAD) во все 4 направления.
P.S. Немогу реализовать идею. HELP!!!
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
указатель мыши должен двигаться только по отмеченным точкам.
nevo вне форума Ответить с цитированием
Старый 04.04.2008, 18:50   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Попробуй вот это:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
     ignore : boolean;
     CurPos : TPoint;
     LastPos : TPoint;
     procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
   if ignore then exit;
   GetCursorPos(CurPos);
   LastPos := ScreenToClient(CurPos);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var P:TPoint;
    Delta : TPoint;
begin
   if ignore then exit;

   Delta.X := X - LastPos.X;
   Delta.Y := Y - LastPos.Y;
   if (Delta.X = 0) and (Delta.Y = 0) then exit;

   P := Point(CurPos.X+Delta.X, CurPos.Y+Delta.Y);
   P.X := (P.X div 16) * 16 + 16;
   P.Y := (P.Y div 16) * 16 + 16;

   CurPos.X := CurPos.X + Delta.X;
   CurPos.Y := CurPos.Y + Delta.Y;
   LastPos := ScreenToClient(P);

   ignore := true;
   try
      SetCursorPos(P.X, P.Y);
   finally
      ignore := false;
   end;

   Label1.Caption := IntToStr(CurPos.X) + ' x ' + IntToStr(CurPos.Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   SetCursorPos(0, 0);
   ignore := false;
end;

procedure TForm1.FormPaint(Sender: TObject);
var i, j:integer;
begin
   for i:=1 to width div 16 do begin
      for j:=1 to height div 16 do begin
         Canvas.Pixels[i*16,j*16] := clBlack;
      end;
   end;
end;

end.
alexBlack вне форума Ответить с цитированием
Старый 05.04.2008, 09:12   #3
nevo
 
Регистрация: 04.04.2008
Сообщений: 8
По умолчанию ПОЧТИ но всеравно недоганяю.

Почти то, но надо чтобы координаты перескакивали вместе с курсором (Пример: (0,0), (0,50),(50,50), и т.д) т.е если курсор находится на точке то он должен точно отображать ее координаты(X,Y), а при движении курсора допустим в право вниз показать сразу (X+50,Y+50) а не так как в примере. Хотя и на этом спасибо.
nevo вне форума Ответить с цитированием
Старый 05.04.2008, 09:35   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Дискретность легко заменить. В коде меняем 16 на 50 и все.
Если нужны пояснения, спрашивай.
alexBlack вне форума Ответить с цитированием
Старый 06.04.2008, 19:49   #5
nevo
 
Регистрация: 04.04.2008
Сообщений: 8
Восклицание Вариант

Нашел другой вариант более подходящий но немогу избавится от передергивания курсора, немного раздражает, помогите если это возможно.
Заранее спасибо!

procedure MOUSEMOVE(var Message: TWMMouseMove); message WM_MOUSEMOVE;
...
var
Change: Boolean = False;
...
procedure TForm1.MOUSEMOVE(var Message: TWMMouseMove);
const
Step = 20;
var
NewPos: TPoint;
Tmp: Integer;
begin
Change:=not Change;
Label1.Caption:=IntToStr(Message.XP os);
Label2.Caption:=IntToStr(Message.YP os);
Tmp:=(Message.XPos div Step)*Step;
if Message.XPos mod Step > Step div 2 then
Tmp:=Tmp + Step;
NewPos.X:=Tmp;
Tmp:=(Message.YPos div Step)*Step;
if Message.YPos mod Step > Step div 2 then
Tmp:=Tmp + Step;
NewPos.Y:=Tmp;
NewPos:=ClientToScreen(NewPos);
if not Change then
SetCursorPos(NewPos.X, NewPos.Y);
end;
nevo вне форума Ответить с цитированием
Старый 06.04.2008, 21:00   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

ИМХО он все равно будет дергаться. Дело в том, что когда мы получаем событие, курсор уже передвинут, а мы его переставляем.

Есть еще вариант. Когда курсор заходит на форму, отключаем его - ShowCursor(false) и рисуем сами, там, где нам нужно. Когда уходит с формы - включаем.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача указателя в функцию arturka Помощь студентам 3 06.07.2008 00:25
Координаты указателя мыши Артэс Win Api 9 15.06.2008 16:20
Перемещение указателя на следующую запись Avalonix БД в Delphi 6 31.05.2008 11:13
Изменение вида Image при наведении указателя Сергей А Помощь студентам 3 05.08.2007 15:26
Положение указателя мыши Viteef Общие вопросы Delphi 4 26.06.2007 15:59