On 30/7/11 11:15, Leonardo Rame wrote:
Hi, I would like to drag the mouse over a form, while the mouse is
dragged, FPos X and Y values must change in the direction of the move,
but the mouse cursor must be fixed at the position where the first click
was made.
This code does more or less what I want, but has two problems:
1 - The mouse still moves a little.
2 - The values of FPos.X and FPos.Y doesn't change.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in shift then
begin
Mouse.CursorPos := ClientToScreen(FPos);
FPos.X := X;
FPos.Y := Y;
Invalidate;
end;
end;
Changing the mouse cursor position interferes with the Invalidate call.
Try this:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, windows;
type
{ TForm1 }
TForm1 = class(TForm)
Label1: TLabel;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
private
FPos: TPoint;
FOldCursorPos: TPoint;
FOldCursor: TCursor;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssleft in shift then
begin
FPos.X := X;
FPos.Y := Y;
FOldCursorPos:= FPos;
FOldCursor := Cursor;
Cursor := crNone;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in shift then
begin
//Mouse.CursorPos := ClientToScreen(FPos);
FPos.X := X;
FPos.Y := Y;
Invalidate;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Cursor := FOldCursor;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
HCursor : THandle;
begin
Label1.Caption := Format('X: %d - Y: %d', [FPos.X, FPos.Y]);
HCursor := Screen.Cursors[Ord(Screen.Cursor)];
DrawIconEx(Canvas.Handle,
FOldCursorPos.X, FOldCursorPos.y, HCursor, 32, 32, 0, 0, DI_NORMAL) ;
end;
end.
It is only a solution for Windows, and it does not remove the
'permanent' cursor until a second click, but it should get you on the
right path.
Howard
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus