Как нарисовать на TPanel - PullRequest
3 голосов
/ 02 мая 2009

Мне нужно рисовать на TPanel, в идеале напрямую, чтобы у меня не было другого компонента, мешающего перехватывать события мышиных событий (я хочу нарисовать на нем небольшой «размерный захват»). Как мне это сделать?

Ответы [ 4 ]

10 голосов
/ 02 мая 2009

Чтобы действительно сделать это правильно, вам, вероятно, следует написать класс-потомок. Переопределите метод Paint, чтобы нарисовать ручку определения размера, и переопределите методы MouseDown, MouseUp и MouseMove, чтобы добавить функцию изменения размера в элемент управления.

Я думаю, что это лучшее решение, чем пытаться использовать TPanel в коде вашего приложения по нескольким причинам:

  1. Свойство Canvas защищено в TPanel, поэтому у вас нет доступа к нему извне класса. Вы можете обойти это с помощью приведения типов, но это обман.
  2. «Изменение размера» больше напоминает функцию панели, чем функцию приложения, поэтому поместите ее в код для панели управления, а не в основной код приложения.

Вот кое-что, с чего можно начать:

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;
7 голосов
/ 02 мая 2009

Это один из многих способов, которыми Raize Components может сделать вашу жизнь проще. Я просто захожу в Delphi, захожу на TRzPanel и набираю:

RzPanel1.Canvas.Rectangle ...

Я уверен, что есть и другие решения, но мне не нужно искать их с Raize.

(просто довольный клиент около 10 лет ...)

РЕДАКТИРОВАТЬ: Учитывая вашу цель и ваше заявление о том, что у вас уже есть Raize Components, я должен также отметить, что TRzSizePanel обрабатывает изменение размера панели и полезные события, такие как OnCanResize (чтобы определить, хотите ли вы разрешить изменение размера для определенной новой ширины или высота).

4 голосов
/ 02 мая 2009

Самый простой способ сделать это - просто нанести TImage на панель. Но если вы действительно не хотите этого делать, наберите TCanvas в редакторе кода, нажмите F1 и получайте удовольствие, узнавая, как это работает под капотом. (Не говори, что я тебя не предупреждал ...)

2 голосов
/ 02 мая 2009

Как добавить размерные маркеры к элементам управления, размер которых изменяется во время выполнения: http://delphi.about.com/library/weekly/aa110105a.htm

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

...