Frage

Ich brauche auf einem TPanel zu ziehen, idealerweise direkt so muss ich nicht eine andere Komponente auf ihm in den Weg mousevent-Ereignis immer Trapping (Ich möchte ein wenig „size-Griff“ ziehen). Wie soll ich über das tun dies gehen?

War es hilfreich?

Lösung

Um wirklich richtig es, sollten Sie wahrscheinlich ein Nachkomme Klasse schreiben. Überschreiben der Paint Methode auf die Leimung Griff zu ziehen, und überschreiben die MouseDown, MouseUp und MouseMove Methoden Ändern der Größe Funktionalität der Steuerung hinzuzufügen.

Ich denke, das ist eine bessere Lösung als zu versuchen, auf einen TPanel im Anwendungscode für ein paar Gründe zu ziehen:

  1. Die Canvas Eigenschaft wird in TPanel geschützt, so dass Sie keinen Zugriff auf sie von außerhalb der Klasse. Sie können mit Typ-Casting um das zu bekommen, aber das ist Betrug.
  2. Die „resizability“ klingt eher wie ein Merkmal der Platte als ein Merkmal der Anwendung, so legt es in Code für das Control Panel, nicht im Haupt Code Ihrer Anwendung.

Hier ist etwas für den Anfang:

type
  TSizablePanel = class(TPanel)
  private
    FDragOrigin: TPoint;
    FSizeRect: TRect;
  protected
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  end;

procedure TSizeablePanel.Paint;
begin
  inherited;
  // Draw a sizing grip on the Canvas property
  // There's a size-grip glyph in the Marlett font,
  // so try the Canvas.TextOut method in combination
  // with the Canvas.Font property.
end;

procedure TSizeablePanel.MouseDown;
begin
  if (Button = mbLeft) and (Shift = []) 
      and PtInRect(FSizeRect, Point(X, Y)) then begin
    FDragOrigin := Point(X, Y);
    // Need to capture mouse events even if the mouse
    // leaves the control. See also: ReleaseCapture.
    SetCapture(Handle);
  end else inherited;
end;

Andere Tipps

Dies ist eine der vielen Möglichkeiten, wie viele Raize Komponenten kann Ihnen das Leben leichter machen. Ich gehe nur in Delphi, fallen auf einem TRzPanel, und geben Sie:

  

RzPanel1.Canvas.Rectangle ...

Ich bin sicher, es gibt auch andere Lösungen -. Aber ich habe nicht für sie mit Raize aussehen

(nur ein zufriedener Kunde seit etwa 10 Jahren ...)

EDIT: Da Ihr Ziel und Ihre Aussage, dass Sie Raize Komponenten bereits haben, sollte ich auch darauf hinweisen, dass TRzSizePanel Redimensionierung der Platte und nützliche Veranstaltungen wie OnCanResize Griffe (um festzustellen, ob Sie Ändern der Größe auf eine bestimmte neue Breite zulassen möchten oder Höhe).

Der einfachste Weg, es zu tun ist, um nur ein TImage auf dem Panel. Aber wenn Sie wirklich wollen nicht, das zu tun, geben Sie TCanvas in den Code-Editor, traf F1, und Spaß haben zu lernen, wie es funktioniert unter der Haube. (Sagen Sie nicht, ich hätte dich nicht gewarnt ...)

Wie Hinzufügen Größe Griffe zu Steuerelementen zur Laufzeit ändert Größe ist: http://delphi.about.com/library/weekly/aa110105a.htm

TAdvPanel: http://www.tmssoftware.com/site/advpanel.asp

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