Delphi arrastar imagens desafio
-
20-08-2019 - |
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;
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.