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

Вниз

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

 
asphix ©   (2004-08-27 11:12) [0]

Помогите советом. Написал прогу, перехватывающую нажатие некоторых клавиш для управления курсором мыши. Проблема в том, что очеь медленно перемещается :( Делаю setcursorpos(x+1,y) например. Мышь еле ползёт.. как бы ускорить процесс и добавить плавности?


 
KADAN ©   (2004-08-27 11:26) [1]

делать ускорение: нажал клавишу, мыша перемещается сначала на 1, потом на два, потом на три...
и еще одно... делать это не от нажатия клавиш, а при keydown запустить таймер, при KeyUp прекратить...


 
Rem   (2004-08-27 11:31) [2]

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 IncX: integer;
 IncY: integer;
 i: integer;
 P: TPoint;
begin
 IncX := 0;
 IncY := 0;
 case Key of
   VK_LEFT: IncX := -1;
   VK_RIGHT: IncX := 1;
   VK_UP: IncY := -1;
   VK_DOWN: IncY := 1;
 end;
 for i := 0 to 5 do
 begin
   GetCursorPos(P);
   P.X := P.X + IncX;
   P.Y := P.Y + IncY;
   SetCursorPos(P.X, P.Y);
   Sleep(10);
 end;
end;


 
Rem   (2004-08-27 11:38) [3]

Можно еще вот это добавить:

var
 Incr: integer;
 ...
begin
 if (ssCtrl in Shift) then
   Incr := 3
 else
   Incr := 1;
 case Key of
   VK_LEFT: IncX := -Incr;
   VK_RIGHT: IncX := Incr;
   VK_UP: IncY := -Incr;
   VK_DOWN: IncY := Incr;
 end;
...


 
asphix ©   (2004-08-27 11:59) [4]

примерно так и пробовал. Просто стоит hook на 4 клавиши.. и на системном уровне всё происходит медленно :( Может как вариант, попробовать при нажатии нужной клавиши вызывать системное событие двидения мыши? или такого не может быть?


 
Rem   (2004-08-27 12:03) [5]

cм. внимательно:
for i := 0 to 5 do
begin
  GetCursorPos(P);
  P.X := P.X + IncX;
  P.Y := P.Y + IncY;
  SetCursorPos(P.X, P.Y);
  Sleep(10);
end;


За одно нажатие - 5 движений.


 
KADAN ©   (2004-08-27 12:34) [6]

вот немного изменил идею Rem:
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure Timer1Timer(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 cancel:boolean=true;
 IncX: integer;
 IncY: integer;
 P: TPoint;
 key:cardinal;

const
 MAXSPEED=10;//â ïèêñåëàõ
 SPEEDSTEP=10;//êîëè÷åñòâî ïðîõîäîâ öèêëà, äëÿ óâåëè÷åíèÿ ñêîðîñòè
              //÷åì ìåíüøå ÷èñëî, òåì ñèëüíåå áóäåò óñêîðÿòüñÿ
 TimerInterval=10;

implementation

{$R *.dfm}

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 cancel:=true;
 IncX := 0;
 IncY := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var signX, SignY:integer;
begin
 if cancel then begin timer1.Enabled:=false; exit; end;
 if (incX=0) and (incY=0) then begin
   cancel:=false;
   case Key of
     VK_LEFT: IncX := -10;
     VK_RIGHT: IncX := 10;
     VK_UP: IncY := -10;
     VK_DOWN: IncY := 10;
   end;
 end;
 GetCursorPos(P);
 P.X := P.X + IncX div speedstep;
 P.Y := P.Y + IncY div speedstep;
 if incX<0 then signX:=-1 else signX:=1;
 if incY<0 then signY:=-1 else signY:=1;
 SetCursorPos(P.X, P.Y);
 if boolean(incx) and (abs(incx)<maxspeed*speedstep) then incX:=(abs(incX)+1)*signX;
 if boolean(incy) and (abs(incy)<maxspeed*speedstep) then incY:=(abs(incY)+1)*signY;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if cancel then begin
  Unit1.Key:=Key;
  case Key of
    VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN: begin
      timer1.Interval:=TimerInterval;
      timer1.Enabled:=true;
      cancel:=false;
    end;
  end;
 end;
end;

end.


 
Rem   (2004-08-27 12:46) [7]

[6]
 Ух, сколько глобальных переменных! :)

type
 TForm1 = class(TForm)
 ...
 private
   m_iCount: integer;
 end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
IncX: integer;
IncY: integer;
i: integer;
P: TPoint;
begin
IncX := 0;
IncY := 0;
inc(m_iCount);
case Key of
  VK_LEFT: IncX := -(m_iCount div 10 + 1);
  VK_RIGHT: IncX := (m_iCount div 10 + 1);
  VK_UP: IncY := -(m_iCount div 10 + 1);
  VK_DOWN: IncY := (m_iCount div 10 + 1);
end;
GetCursorPos(P);
P.X := P.X + IncX;
P.Y := P.Y + IncY;
SetCursorPos(P.X, P.Y);
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 m_iCount := 0;
end;


 
Rem   (2004-08-27 12:50) [8]

Так красивее будет:

GetCursorPos(P);
SetCursorPos(P.X + IncX, P.Y + IncY);


:)



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

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

Наверх




Память: 0.49 MB
Время: 0.022 c
6-1089068198
RaPToR_1
2004-07-06 02:56
2004.09.12
сокет в компоненте


9-1083055950
human
2004-04-27 12:52
2004.09.12
Сетевые шахматы


3-1092641183
Dmitriy O.
2004-08-16 11:26
2004.09.12
Как обьявить поле програмно ?


14-1093357407
alsov1
2004-08-24 18:23
2004.09.12
Ищу электронные книги по Ораклу


10-1036136259
kostik78ua
2002-11-01 10:37
2004.09.12
Коннекты остаются :(