Конференция "KOL" » Как отлавить сообщение мышки за окном? [Delphi, Windows]
 
  • Valera (12.05.08 03:10) [0]
    Как отловить сообщения мышки если она Нажала на PaintBox и переместилась на рабочий стол.
    Почему то когда я в VCL делал Paint
    там автоматом мне приходили сообщения от мышки (MouseMove) если она нажала на мою форму и не отпустила и ездила по рабочему столу.
    А в kol они не приходят. В kol приходят сообщения если мышка находится над PaintBox.
  • Valera (12.05.08 03:24) [1]
    Сюда можно дописать...

    program paintMy;

    uses
    Windows,
    messages,
    KOL;

    var
    form,PaintBox:PControl;
    PaintBmp,MainTemp:Pbitmap;
    xD,yD:integer;
    mousedown:boolean;

    procedure MouseDown_(Dummy : Pointer;Sender: PControl; var Mouse: TMouseEventData );
    begin
    MainTemp.CopyRect(MainTemp.BoundsRect, PaintBmp,PaintBmp.BoundsRect);
    xD:=Mouse.x;
    yd:=Mouse.y;
    PaintBox.Invalidate;
    mousedown:=True;
    end;

    procedure MouseMove_(Dummy : Pointer; Sender: PControl; var Mouse: TMouseEventData );
    begin
    IF mousedown then begin
      PaintBmp.CopyRect(PaintBmp.BoundsRect, MainTemp, MainTemp.BoundsRect);
      PaintBmp.Canvas.MoveTo(xd,yd);
      PaintBmp.Canvas.LineTo(Mouse.x,Mouse.y);
    end;
    PaintBox.Invalidate;
    end;

    procedure MouseUp_(Dummy : Pointer; Sender: PControl; var Mouse: TMouseEventData );
    begin
    if mousedown then begin
      PaintBmp.CopyRect(PaintBmp.BoundsRect, MainTemp, MainTemp.BoundsRect);
      PaintBmp.Canvas.MoveTo(xd,yd);
      PaintBmp.Canvas.LineTo(Mouse.x,Mouse.y);
    end;
    PaintBox.Invalidate;
    mousedown:=False;
    end;

    procedure Paint( Dummy : Pointer; Sender: PControl; DC: HDC );
    begin
    PaintBmp.Draw(DC,0,0);
    end;

    begin
    form:=NewForm(nil,'Paint').SetSize(800,800);

    PaintBox:=NewPaintBox(Form);
    PaintBox.Align:=caClient;
    PaintBox.OnMouseDown:= TOnMouse( MakeMethod( nil, @MouseDown_ ) );
    PaintBox.OnMouseMove:= TOnMouse( MakeMethod( nil, @MouseMove_ ) );
    PaintBox.OnMouseUp:= TOnMouse( MakeMethod( nil, @MouseUp_ ) );
    PaintBox.OnPaint:= TOnPaint( MakeMethod( nil, @Paint ) );
    ///**************************************************************
    MainTemp:=newBitmap(PaintBox.Width,PaintBox.Height);
    MainTemp.Invert;
    PaintBmp:=newBitmap(PaintBox.Width,PaintBox.Height);
    PaintBmp.Invert;

    Run(form);  ////// запуск формы

    end.


  • D[u]fa (12.05.08 09:49) [2]
    попробуй в маусдовн добавить SetCapture() а в моусап ReleaseCapture
  • Valera (12.05.08 15:26) [3]
    Я не понял как делать SetCapture and ReleaseCapture.
    Добавь код в исходник а то я не понял Куда именно вставлять SetCapture.
  • Valera (12.05.08 15:34) [4]
    Ой спасибо я все понял..... Большое Спасибо D[u]fa....

    Вот что я сделал



    program paintMy;

    uses
    Windows,
    messages,
    KOL;

    var
    form,PaintBox:PControl;
    PaintBmp,MainTemp:Pbitmap;
    xD,yD:integer;
    mousedown:boolean;

    procedure MouseDown_(Dummy : Pointer;Sender: PControl; var Mouse: TMouseEventData );
    begin
    MainTemp.CopyRect(MainTemp.BoundsRect, PaintBmp,PaintBmp.BoundsRect);
    xD:=Mouse.x;
    yd:=Mouse.y;
    SetCapture(PaintBox.GetWindowHandle);
    PaintBox.Invalidate;
    mousedown:=True;
    end;

    procedure MouseMove_(Dummy : Pointer; Sender: PControl; var Mouse: TMouseEventData );
    begin
    IF mousedown then begin
     PaintBmp.CopyRect(PaintBmp.BoundsRect, MainTemp, MainTemp.BoundsRect);
     PaintBmp.Canvas.MoveTo(xd,yd);
     PaintBmp.Canvas.LineTo(Mouse.x,Mouse.y);
    end;
    PaintBox.Invalidate;
    end;

    procedure MouseUp_(Dummy : Pointer; Sender: PControl; var Mouse: TMouseEventData );
    begin
    if mousedown then begin
     PaintBmp.CopyRect(PaintBmp.BoundsRect, MainTemp, MainTemp.BoundsRect);
     PaintBmp.Canvas.MoveTo(xd,yd);
     PaintBmp.Canvas.LineTo(Mouse.x,Mouse.y);
     ReleaseCapture;
    end;
    PaintBox.Invalidate;
    mousedown:=False;
    end;

    procedure Paint( Dummy : Pointer; Sender: PControl; DC: HDC );
    begin
    PaintBmp.Draw(DC,0,0);
    end;

    begin
    form:=NewForm(nil,'Paint').SetSize(800,800);

    PaintBox:=NewPaintBox(Form);
    PaintBox.Align:=caClient;
    PaintBox.OnMouseDown:= TOnMouse( MakeMethod( nil, @MouseDown_ ) );
    PaintBox.OnMouseMove:= TOnMouse( MakeMethod( nil, @MouseMove_ ) );
    PaintBox.OnMouseUp:= TOnMouse( MakeMethod( nil, @MouseUp_ ) );
    PaintBox.OnPaint:= TOnPaint( MakeMethod( nil, @Paint ) );
    ///**************************************************************
    MainTemp:=newBitmap(PaintBox.Width,PaintBox.Height);
    MainTemp.Invert;
    PaintBmp:=newBitmap(PaintBox.Width,PaintBox.Height);
    PaintBmp.Invert;

    Run(form);  ////// запуск формы

    end.

  • D[u]fa (12.05.08 15:39) [5]
    Да все верно, либо просто PaintBox.Handle
 
Конференция "KOL" » Как отлавить сообщение мышки за окном? [Delphi, Windows]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]