Comment dessiner sur un TPanel
-
03-07-2019 - |
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?
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:
- La propriété
Canvas
est protégée dansTPanel
, 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. - 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