[Lazarus] (no subject)

Bart bartjunk64 at gmail.com
Sun Jul 31 15:58:26 CEST 2011


As an end-user I would get rather confused if my mouse cursor didn't
move anymore when I was  moving the mouse.

Bart

On 7/31/11, Howard Page-Clark <hdpc at talktalk.net> wrote:
> 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
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>




More information about the Lazarus mailing list