Вопрос

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

Это было полезно?

Решение

Чтобы действительно сделать это правильно, вам, вероятно, следует написать класс-потомок. Переопределите метод 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;
    

    Другие советы

    Это один из многих способов, которые Компоненты для Разрыхлителя это может облегчить вашу жизнь.Я просто захожу в Delphi, захожу на TRzPanel и набираю:

    RzPanel1.Холст.Прямоугольник...

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

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

    Редактировать:Учитывая вашу цель и ваше заявление о том, что у вас уже есть компоненты Raize, я должен также отметить, что TRzSizePanel обрабатывает изменение размера панели и полезные события, такие как OnCanResize (чтобы определить, хотите ли вы разрешить изменение размера до определенной новой ширины или высоты).

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

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

    Панель TAdvPanel:http://www.tmssoftware.com/site/advpanel.asp

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top