Como desenhar em um TPanel
-
03-07-2019 - |
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?
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:
- A propriedade
Canvas
é protegida emTPanel
, 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. - 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