Pergunta

O código abaixo permite um controle (um rótulo, por exemplo) para mostrar imagens de arrastar enquanto a operação de arrastar.

O meu problema é que eu faço não quero mostrar a imagem de arrastar instanly quando o arrastar começa, eu quero a imagem a ser exibida quando o mouse está em limites específicos do controlo - por exemplo. na metade direita da etiqueta.

Até agora eu não tenho sido capaz de encontrar uma solução para isso - a imagem só fica exibido instantaneamente (a menos que eu modificar a fonte VCL). Eu aprecio todos os truques neste momento para obter o comportamento desejado antes abondoning drag & drop utilitários VCL e rolar um costume captura do mouse.

Aqui está um exemplo pseudocódigo para permitir arrastar imagens para uma etiqueta ..

{ turn on dragging }
Label1.DragMode := dmManual;
Label1.ControlStyle := Label1.ControlStyle + [csDisplayDragImage];

type 
  // VCL needs this for getting drag images..
  TMyDragObject = class(TDragControlObject)
  protected
    function GetDragImages: TDragImageList; override; 
  end;

function TMyDragObject.GetDragImages: TDragImageList;
begin
  Result := Form1.ImageList1;
end;             

procedure TForm1.Label1MouseDown(...);
begin
  { start the dragging manually }
  Label1.BeginDrag(False, 4); // the problem area! image is shown instantly at here!
end;

procedure TForm1.Label1StartDrag(Sender: TObject; var DragObject: TDragObject);
var b : TBitmap;
begin
  ImageList1.Clear;
  DragObject := TMyDragObject.Create(self);

  b := TBitmap.Create;
  try
    b.Width := ImageList1.Width;
    b.Height := ImageList1.Height;
    b.LoadFromFile('/path/to/image');
    ImageList1.Add(b, nil);
  finally
    b.Free;
  end;
end;

procedure TForm1.Label1MouseMove(...);
begin
  if X > Label1.Width div 2 then // right half
    // ??? - do show the drag image
  else
    // ??? - no drage image should be shown
end;
Foi útil?

Solução 3

Como o silêncio sobre o tema implica, suponho que eu quero é um pouco mais alto para os drag & drop utilitários VCL padrão.

De qualquer forma, para obter o efeito desejado - que é ter mais controle sobre arrastando operação, aqui está uma forma que envolve a captura o rato e processar as mensagens manualmente:

  SetCapture(Handle);
  try
    while GetCapture = Handle do 
       { Process messages like mouse move, click, etc..
         ie. Change the drag image when the control under cursor changes.. } 
  finally
    if Handle = GetCapture then
      ReleaseCapture;
  end;

Outras dicas

Faça o TBitmap, chamado b, uma variável global e remover a linha

ImageList1.Add (b, nil);

a partir do procedimento Label1StartDrag e colocá-lo em uma OnDragOverProcedure. Isso permitirá que ImageList1 permaneça em branco até que o mouse foi movido dos quatro pixels especificados no

Label1.BeginDrag (False, 4);

Label1.DragMode: = dmAutomatic;

Você tentou usar dmManual? Você deve escrever mais algum código, mas você pode mudar mais do processo.

A propósito, por que você quer mudar o comportamento padrão? Seus usuários provavelmente esperar o padrão e pode tornar-se frustrados se os comporta programa diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top