Как нарисовать на TPanel
Мне нужно рисовать на TPanel, в идеале напрямую, чтобы у меня не было другого компонента, мешающего перехватывать события мышиных событий (я хочу нарисовать на нем небольшой "размерный захват"). Как мне это сделать?
4 ответа
Чтобы действительно сделать это правильно, вам, вероятно, следует написать класс-потомок. Переопределить 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;
Это один из многих способов, с помощью которых Raize Components может сделать вашу жизнь проще. Я просто захожу в Delphi, захожу на TRzPanel и набираю:
RzPanel1.Canvas.Rectangle...
Я уверен, что есть другие решения - но мне не нужно искать их с Raize.
(просто довольный клиент около 10 лет...)
РЕДАКТИРОВАТЬ: Учитывая вашу цель и ваше заявление о том, что у вас уже есть Raize Components, я должен также отметить, что TRzSizePanel обрабатывает изменение размера панели и полезные события, такие как OnCanResize (чтобы определить, хотите ли вы разрешить изменение размера до определенной новой ширины или высоты),
Самый простой способ сделать это - просто нанести TImage на панель. Но если вы действительно не хотите этого делать, наберите TCanvas в редакторе кода, нажмите F1 и получайте удовольствие, узнавая, как это работает под капотом. (Не говори, что я тебя не предупреждал...)
Как добавить дескрипторы размера к элементам управления, размер которых изменяется во время выполнения: http://delphi.about.com/library/weekly/aa110105a.htm
TAdvPanel: http://www.tmssoftware.com/site/advpanel.asp