Delphi ziehen Bilder Herausforderung
-
20-08-2019 - |
Frage
Der folgende Code ermöglicht eine Steuerung (ein Label zum Beispiel) drag Bilder während der Ziehoperation zu zeigen.
Mein Problem ist, dass ich tue nicht will instanly das Drag-Bild zeigen, wenn das Ziehen beginnt, mag ich das Bild angezeigt werden , wenn die Maus über bestimmte Grenzen ist die Steuerung - zB. in der rechten Hälfte des Etiketts.
Bisher habe ich nicht in der Lage gewesen, eine Lösung für diese zu finden - das Bild nur sofort angezeigt wird (es sei denn ich die VCL Quelle ändern). Ich schätze irgendwelche Tricks an dieser Stelle das gewünschte Verhalten zu erhalten, bevor abondoning VCL Drag & Drop-Dienstprogramme und einen benutzerdefinierten eine Rolle mit der Maus zu erfassen.
Hier ist ein Beispiel Pseudo-Code Drag Bilder für ein Etikett zu ermöglichen ..
{ 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;
Lösung 3
Wie das Schweigen über das Thema schon sagt, nehme ich an, was ich will, ist ein wenig übertrieben für die Standard-VCL Drag & Utilities fallen.
Wie auch immer, die gewünschte Wirkung zu erhalten - das ist mehr als Ziehvorgang mehr Kontrolle zu haben, hier ist ein Weg, den die Nachrichten der Erfassung die Maus und die Verarbeitung beinhaltet manuell:
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;
Andere Tipps
Machen Sie das TBitmap, genannt b, eine globale Variable und entfernen Sie die Zeile
ImageList1.Add (b, nil);
aus dem Label1StartDrag Verfahren und legen Sie sie in einem OnDragOverProcedure. Dies ermöglicht es ImageList1 leer zu bleiben, bis die Maus, um die vier Pixel angegeben in
bewegt hatLabel1.BeginDrag (False, 4);
Label1.DragMode: = dmAutomatic;
Haben Sie versucht, dmManual zu benutzen? Sie sollten etwas mehr Code schreiben, aber Sie können mehr des Prozesses ändern.
By the way, warum wollen Sie das Standardverhalten ändern? Ihre Benutzer wahrscheinlich den Standard erwarten und kann frustriert werden, wenn das Programm verhält sich anders.