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;
War es hilfreich?

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 hat
  
    

Label1.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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top