Buscar

Mover e Redimensionar um TImage

Código

Crie um Form (no meu exemplo Form1) e um Image (Image1). Agora vamos para o código:


unit Unit1;

interface

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

type
  //Estar atento para estas declarações
  TCanSize = (csLeft, csUp, csRight, csDown);
  TCanSizes = set of TCanSize;
 
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    FCanSizes : TCanSizes; //Declaração de variável importante
  public
    { Public declarations }
  end;

var
  Form1: TForm1;         //GERADO AUTOMATICAMENTE PELO DELPHI!
  mouse_x : integer;     //Distância do Cursor do Mouse até o início do TImage em X
  mouse_y : integer;     //Distância do Cursor do Mouse até o início do TImage em Y
  IS_DRAG : boolean;     //Verificar se o usuário está "desenhando"
  CURSOR_ATUAL: integer; //Tipo de Cursor: crSizeNWSE, crSizeNS, etc...

const
  sc_WIN_TITLE_BAR = 25; //Constante da altura da Barra de título do Windows

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   IS_DRAG := false;     //Ao iniciar o programa o usuário não está desenhando.
   DoubleBuffered:=True; //Para mover e redimensionar um TImage sem que ele "pisque"
                         //Obrigado Dapper Rodrigo pela dica.
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Rects : array[0..7]of TRect;
  delta : integer;
  old_imagex : integer; //variável auxiliar: antiga posição x do TImage
  old_imagey : integer; //variável auxiliar: antiga posição y do TImage
  pt : TPoint;
begin
    if IS_DRAG = false then
    //Se não estiver desenhando, o programa somente alterará o
    //cursor do mouse dependendo da região do TImage
    begin
      if Shift = [] then begin
          with Sender as TImage do begin

            delta := 6;
            pt := Point(X,Y);

            Rects[0] := Rect(0, 0, delta, delta);
            Rects[1] := Rect(delta, 0, Width -delta, delta);
            Rects[2] := Rect(Width -delta, 0, Width, delta);

            Rects[3] := Rect(0, delta, delta, Height -delta);
            Rects[4] := Rect(Width -delta, delta, Width, Height -delta);

            Rects[5] := Rect(0, Height -delta, delta, Height);
            Rects[6] := Rect(delta, Height -delta, Width -delta, Height);
            Rects[7] := Rect(Width -delta, Height -delta, Width, Height);

            //Definindo o cursor do mouse para cada "canto" do TImage
            if PtInRect(Rects[0], pt) then begin Cursor := crSizeNWSE; FCanSizes := [csLeft, csUp]; CURSOR_ATUAL := 0 end
            else
            if PtInRect(Rects[1], pt) then begin Cursor := crSizeNS  ; FCanSizes := [csUp]; CURSOR_ATUAL := 1 end
            else
            if PtInRect(Rects[2], pt) then begin Cursor := crSizeNESW; FCanSizes := [csRight, csUp]; CURSOR_ATUAL := 2 end
            else
            if PtInRect(Rects[3], pt) then begin Cursor := crSizeWE  ; FCanSizes := [csLeft];  CURSOR_ATUAL := 3 end
            else
            if PtInRect(Rects[4], pt) then begin Cursor := crSizeWE  ; FCanSizes := [csRight]; CURSOR_ATUAL := 4 end
            else
            if PtInRect(Rects[5], pt) then begin Cursor := crSizeNESW; FCanSizes := [csLeft, csDown]; CURSOR_ATUAL := 5 end
            else
            if PtInRect(Rects[6], pt) then begin Cursor := crSizeNS  ; FCanSizes := [csDown]; CURSOR_ATUAL := 6 end
            else
            if PtInRect(Rects[7], pt) then begin Cursor := crSizeNWSE; FCanSizes := [csRight, csDown]; CURSOR_ATUAL := 7 end
            else
              begin Cursor := crDefault; Image1.cursor := crDefault; CURSOR_ATUAL := 8; end;
          end;
      end;
    end
    else
    //Caso contrário (usuário está desenhando) o programa irá redimensionar ou
    //mover o TImage
    begin
        case CURSOR_ATUAL of
            0: //Redimensionamento para cima e à esquerda
               begin
                   old_imagex := Image1.Left;
                   Image1.left := Mouse.CursorPos.X - mouse_x - Form1.Left;
                   Image1.Width := Image1.Width + (old_imagex - Image1.Left);

                   old_imagey := Image1.top;
                   Image1.Top := Mouse.CursorPos.Y - mouse_y - Form1.Top;
                   Image1.Height := Image1.Height + (old_imagey - Image1.top);
               end;

            1: //Redimensionamento para cima
               begin
                   old_imagey := Image1.top;
                   Image1.Top := Mouse.CursorPos.Y - mouse_y - Form1.Top;
                   Image1.Height := Image1.Height + (old_imagey - Image1.top);
               end;

            2: //Redimensionamento para cima e à direita
               begin
                   Image1.Width := Mouse.CursorPos.X - Form1.Left - Image1.Left;

                   old_imagey := Image1.top;
                   Image1.Top := Mouse.CursorPos.Y - mouse_y - Form1.Top;
                   Image1.Height := Image1.Height + (old_imagey - Image1.top);
               end;

            3: //Redimensionamento para a esquerda
               begin
                   old_imagex := Image1.Left;
                   Image1.left := Mouse.CursorPos.X - mouse_x - Form1.Left;
                   Image1.Width := Image1.Width + (old_imagex - Image1.Left);
               end;

            4: //Redimensionamento para a direita
               begin
                   Image1.Width := Mouse.CursorPos.X - Form1.Left - Image1.Left;
               end;

            5: //Redimensionamento para baixo e à esquerda
               begin
                   old_imagex := Image1.Left;
                   Image1.left := Mouse.CursorPos.X - mouse_x - Form1.Left;
                   Image1.Width := Image1.Width + (old_imagex - Image1.Left);

                   Image1.Height := Mouse.CursorPos.Y - Form1.Top - Image1.top - sc_WIN_TITLE_BAR;
               end;

            6: //Redimensionamento para baixo
               begin
                   Image1.Height := Mouse.CursorPos.Y - Form1.Top - Image1.top - sc_WIN_TITLE_BAR;
               end;

            7: //Redimensionamento para baixo e à direita
               begin
                   Image1.Width := Mouse.CursorPos.X - Form1.Left - Image1.Left;
                   Image1.Height := Mouse.CursorPos.Y - Form1.Top - Image1.top - sc_WIN_TITLE_BAR;
               end;

            8: //Mover TImage
               begin
                   Image1.left := Mouse.CursorPos.X - mouse_x - Form1.Left;
                   Image1.Top := Mouse.CursorPos.Y - mouse_y - Form1.Top;
               end;
          end;
    end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   //Distância do Cursor do Mouse até o início do TImage - em X
   mouse_x := Mouse.CursorPos.X - Image1.Left - Form1.Left;

   //Distância do Cursor do Mouse até o início do TImage - em Y
   mouse_y := Mouse.CursorPos.Y - Image1.Top - Form1.Top;

   //O usuário está desenhando
   IS_DRAG := true;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   //O usuário não está desenhando mais...
   IS_DRAG := false;
end;

end.

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Componentes
Adicionada dia: 22/02/10
Por: Thiago Da Silva Amate
Visualizada: 8523 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009