Чтобы действительно сделать это правильно, вам, вероятно, следует написать класс-потомок. Переопределите метод Paint
, чтобы нарисовать ручку определения размера, и переопределите методы MouseDown
, MouseUp
и MouseMove
, чтобы добавить функцию изменения размера в элемент управления.
Я думаю, что это лучшее решение, чем пытаться использовать TPanel
в коде вашего приложения по нескольким причинам:
- Свойство
Canvas
защищено в TPanel
, поэтому у вас нет доступа к нему извне класса. Вы можете обойти это с помощью приведения типов, но это обман.
- «Изменение размера» больше напоминает функцию панели, чем функцию приложения, поэтому поместите ее в код для панели управления, а не в основной код приложения.
Вот кое-что, с чего можно начать:
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;