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

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

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

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

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

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

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

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

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

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

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

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

Примечание.

Используйте свойство Control.Region для реализации не прямоугольного элемента управления.

См. также