Question

J'ai besoin de dessiner sur un TPanel, idéalement directement pour ne pas avoir un composant en plus empêchant la capture d'événements de souris (je veux dessiner un peu "taille-grip" dessus) . Comment dois-je m'y prendre?

Était-ce utile?

La solution

Pour bien faire les choses, vous devriez probablement écrire une classe descendante. Remplacez la méthode Paint pour dessiner la poignée de redimensionnement, et remplacez les méthodes MouseDown , MouseUp et MouseMove à ajouter redimensionnement des fonctionnalités du contrôle.

Je pense que c'est une meilleure solution que d'essayer de tirer sur un TPanel dans votre code d'application pour plusieurs raisons:

  1. La propriété Canvas est protégée dans TPanel , de sorte que vous n'y avez pas accès depuis l'extérieur de la classe. Vous pouvez contourner cela avec le casting de type, mais c'est de la triche.
  2. La " resizability " sonne plus comme une fonctionnalité du panneau que comme une fonctionnalité de l’application; mettez-la donc dans le code du contrôle du panneau, pas dans le code principal de votre application.

Voici quelque chose pour vous aider à démarrer:

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;

Autres conseils

C’est l’un des nombreux moyens par lesquels les composants Raize vous simplifient la vie. Je viens d'aller dans Delphi, déposez un TRzPanel et tapez:

  

RzPanel1.Canvas.Rectangle ...

Je suis sûr qu'il existe d'autres solutions, mais je n'ai pas à les chercher avec Raize.

(juste un client satisfait depuis environ 10 ans ...)

EDIT: Compte tenu de votre objectif et de votre déclaration selon laquelle vous possédez déjà des composants Raize, je tiens également à souligner que TRzSizePanel gère le redimensionnement du panneau et des événements utiles tels que OnCanResize (pour déterminer si vous souhaitez autoriser le redimensionnement à une nouvelle largeur donnée). ou hauteur).

La façon la plus simple de le faire est de simplement mettre un TImage sur le panneau. Mais si vous ne voulez vraiment pas faire cela, tapez TCanvas dans l'éditeur de code, appuyez sur F1 et amusez-vous à comprendre comment cela fonctionne sous le capot. (Ne dites pas que je ne vous ai pas prévenu ...)

Comment ajouter des poignées de taille aux contrôles en cours de redimensionnement au moment de l'exécution: http://delphi.about.com/library/weekly/aa110105a.htm

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top