Pregunta

Necesito dibujar en un TPanel, idealmente directamente, así que no tengo otro componente encima que impida la captura de eventos mousevent (quiero dibujar un poco de "agarre de tamaño" en él) . ¿Cómo debo hacer esto?

¿Fue útil?

Solución

Para hacerlo realmente bien, probablemente deberías escribir una clase descendiente. Anule el método Paint para dibujar el control de tamaño y anule los métodos MouseDown , MouseUp y MouseMove para agregar redimensionar la funcionalidad al control.

Creo que es una mejor solución que intentar dibujar en un TPanel en el código de su aplicación por un par de razones:

  1. La propiedad Canvas está protegida en TPanel , por lo que no tiene acceso a ella desde fuera de la clase. Puedes evitar eso con el casting de tipos, pero eso es trampa.
  2. La " resizabilidad " suena más como una característica del panel que como una característica de la aplicación, así que póngalo en el código para el control del panel, no en el código principal de su aplicación.

Aquí hay algo para empezar:

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;

Otros consejos

Esta es una de las muchas formas en que Raize Components puede hacer su vida más fácil. Solo entro en Delphi, entro en un TRzPanel y escribo:

  

RzPanel1.Canvas.Rectangle ...

Estoy seguro de que hay otras soluciones, pero no tengo que buscarlas con Raize.

(solo un cliente satisfecho por aproximadamente 10 años ...)

EDITAR: Dado su objetivo y su declaración de que ya tiene componentes Raize, también debo señalar que TRzSizePanel maneja el cambio de tamaño del panel y eventos útiles como OnCanResize (para determinar si desea permitir el cambio de tamaño a un nuevo ancho en particular o altura).

La forma más sencilla de hacerlo es poner un TImage en el panel. Pero si realmente no quieres hacer eso, escribe TCanvas en el editor de código, presiona F1 y diviértete aprendiendo cómo funciona bajo el capó. (No digas que no te advertí ...)

Cómo agregar controladores de tamaño a los controles que se redimensionan en tiempo de ejecución: http://delphi.about.com/library/weekly/aa110105a.htm

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top