Поделиться через


Элементы управления, разработанные пользователем

Платформа .NET Framework предоставляет возможность достаточно просто разрабатывать собственные элементы управления. Можно создать пользовательские элементы управления, представляющие собой набор стандартных элементов управления, связанных с помощью кода, или разработать собственный элемент управления "с нуля". Можно даже использовать наследование для создания элемента управления, который наследует из существующего элемента управления, и добавить к унаследованным возможностям новые. Независимо от выбранного подхода платформа .NET Framework обеспечивает возможность создания пользовательского интерфейса для любого разрабатываемого элемента управления.

Рисование элемента управления сопровождается выполнением кода в методе OnPaint элемента управления. Единственным аргументом метода OnPaint является объект PaintEventArgs, предоставляющий все сведения и функциональные возможности, необходимые для отрисовки элемента управления. PaintEventArgs предоставляет в виде свойств два объекта-участника, которые будут использоваться при отрисовке элемента управления.

  • Объект ClipRectangle — это прямоугольник, представляющий ту часть элемента управления, которая будет нарисована. Это может быть весь элемент управления или его часть, в зависимости от того, как рисуется элемент управления.

  • Объект Graphics инскапсулирует несколько графических объектов и методов, предоставляющих функциональные возможности, необходимые для рисования элемента управления.

Дополнительные сведения об объекте Graphics и о том, как им пользоваться, содержатся в разделе Практическое руководство. Создание объектов Graphics для рисования.

Каждый раз, когда элемент управления рисуется или обновляется на экране, запускается событие OnPaint. При этом объект ClipRectangle представляет прямоугольник, в котором будет выполняться рисование. При необходимости обновления всего элемента управления объект ClipRectangle будет предоставлять его размеры. Если обновляться должна только часть элемента управления, объект ClipRectangle будет предоставлять только ту область, которая должна быть перерисована. Примером может служить ситуация, когда один элемент управления частично закрыт другим элементом управления или другой формой пользовательского интерфейса.

При наследовании из класса Control необходимо переопределить метод OnPaint и поместить в него код графической отрисовки. Переопределить метод OnPaint требуется также при предоставлении пользовательского графического интерфейса для наследуемого или пользовательского элемента управления. Ниже представлен пример.

Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
   ' Call the OnPaint method of the base class.
   MyBase.OnPaint(pe)
      
   ' Declare and instantiate a drawing pen.
   Dim myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)
      
   ' Draw an aqua rectangle in the rectangle represented by the control.
   pe.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))
End Sub
protected override void OnPaint(PaintEventArgs pe)
{
   // Call the OnPaint method of the base class.
   base.OnPaint(pe);

   // Declare and instantiate a new pen.
   System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua);

   // Draw an aqua rectangle in the rectangle represented by the control.
   pe.Graphics.DrawRectangle(myPen, new Rectangle(this.Location, 
      this.Size));
}
protected   void OnPaint(PaintEventArgs pe)
{
   // Call the OnPaint method of the base class.
   super.OnPaint(pe);

   // Declare and instantiate a new pen.
   System.Drawing.Pen myPen =  new System.Drawing.Pen(Color.get_Aqua());

   // Draw an aqua rectangle in the ClipRectangle.
   pe.get_Graphics().DrawRectangle(myPen, pe.get_ClipRectangle());
}

В предыдущем примере описывается отрисовка элемента управления с очень простым графическим представлением. В примере вызывается метод OnPaint базового класса, создается объект Pen, с помощью которого будет выполняться рисование, и в прямоугольнике, заданном свойствами Location и Size элемента управления, рисуется эллипс. В этом примере описывается использование объекта Graphics, содержащегося в объекте PaintEventArgs, но следует отметить, что в большинстве случаев код отрисовки будет намного более сложным. Необходимо также отметить, что при наследовании из класса, уже имеющего графическое представление (такого как UserControl или Button), в случае, если это представление не должно включаться в отрисовку, не следует вызывать метод базового класса OnPaint.

Код, содержащийся в методе OnPaint элемента управления, будет выполняться при первом рисовании элемента управления и при каждом его обновлении. Чтобы убедиться, что элемент управления перерисовывается при каждом изменении его размеров, следует добавить в конструктор элемента управления следующую строку:

SetStyle(ControlStyles.ResizeRedraw, True)
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, true);

Примечание

Чтобы реализовать элемент управления непрямоугольной формы, следует использовать свойство Control.Region.

См. также

Задачи

Практическое руководство. Создание объектов Graphics для рисования

Ссылки

Region

ControlStyles

Graphics

OnPaint

PaintEventArgs

Основные понятия

Составные элементы управления

Создание собственных элементов управления