Pergunta

Eu preciso recorrer a uma TPanel, idealmente diretamente de modo que não tenho outro componente em cima dela ficar no caminho de trapping mousevent-evento (Eu quero desenhar um pouco "tamanho-grip" nele). Como devo ir sobre como fazer isso?

Foi útil?

Solução

Para realmente fazer isso direito, você provavelmente deve escrever uma classe descendente. Substitua o método Paint para desenhar a alça de dimensionamento, e substituir os MouseDown, MouseUp e métodos MouseMove para adicionar redimensionamento funcionalidade ao controlo.

Eu acho que é uma solução melhor do que tentar desenhar em um TPanel no código do aplicativo para um par de razões:

  1. A propriedade Canvas é protegida em TPanel, então você não tem acesso a ele de fora da classe. Você pode contornar isso com o tipo de fundição, mas isso é batota.
  2. Os sons "resizability" mais como uma característica do painel do que uma característica da aplicação, para colocá-lo no código para o painel de controle, não no código principal do aplicativo.

O Aqui algo para você começar:

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;

Outras dicas

Este é um dos muitos caminhos que Raize Componentes podem tornar sua vida mais fácil. Eu só entrar em Delphi, cair em um TRzPanel, e digite:

RzPanel1.Canvas.Rectangle ...

Estou certo de que há outras soluções - mas eu não tenho que olhar para eles com Raize

.

(apenas um cliente satisfeito por aproximadamente 10 anos ...)

EDIT: Dado o seu objetivo, e sua declaração de que você tem Raize Components já, eu também de salientar que alças TRzSizePanel redimensionamento do painel e eventos úteis como OnCanResize (para determinar se você deseja permitir o redimensionamento para uma nova largura especial ou altura).

A maneira mais simples de fazer isso é apenas colocar um TImage no painel. Mas se você realmente não quer fazer isso, digite TCanvas para o editor de código, bateu F1, e se divertir aprendendo sobre como ele funciona sob o capô. (Não diga que eu não avisei ...)

Como adicionar Tamanho Handles para Controls sendo redimensionada em tempo de execução: http://delphi.about.com/library/weekly/aa110105a.htm

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top