Книга: Программирование КПК и смартфонов на .NET Compact Framework

Округленные прямоугольники

Округленные прямоугольники

Так как .NET Compact Framework не позволяет создавать округленные прямоугольники встроенными средствами, то необходимо самостоятельно реализовать эту задачу. В этом разделе будет рассматриваться решение, предложенное Алексом Яхниным (Alex Yakhnin) в его блоге blog.opennetcf.org/ayakhnin/. Для достижения заданного эффекта надо нарисовать серию линий, которые соединяют эллипсы, и закрасить внутреннюю область сплошным цветом (рис. 6.7).


Рис. 6.7. Создание прямоугольника со скругленным углами

Соответствующий код приведен в листинге 6.19.

Листинг 6.19

public static void DrawRoundedRectangle(Graphics g, Pen p, Color backColor,
 Rectangle rc, Size size) {
 Point[] points = new Point[8];
 // подготовим точки для фигуры
 points[0].X = rc.Left + size.Width / 2;
 points[0].Y = rc.Top + 1;
 points[1].X = rc.Right - size.Width / 2;
 points[1].Y = rc.Top + 1;
 points[2].X = rc.Right;
 points[2].Y = rc.Top + size.Height / 2;
 points[3].X = rc.Right;
 points[3].Y = rc.Bottom - size.Height / 2;
 points[4].X = rc.Right - size.Width / 2;
 points[4].Y = rc.Bottom;
 points[5].X = rc.Left + size.Width / 2;
 points[5].Y = rc.Bottom;
 points[6].X = rc.Left + 1;
 points[6].Y = rc.Bottom - size.Height / 2;
 points[7].X = rc.Left + 1;
 points[7].Y = rc.Top + size.Height / 2;
 // приготовим кисть для фона
 Brush fillBrush = new SolidBrush(backColor);
 // рисуем отрезки и круги для округленного прямоугольника
 g.DrawLine(p, rc.Left + size.Width / 2, rc.Top,
  rc.Right - size.Width / 2, rc.Top);
 g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Top,
  size.Width, size.Height);
 g.DrawEllipse(p, rc.Right - size.Width, rc.Top, size.Width, size.Height);
 g.DrawLine(p, rc.Right, rc.Top + size.Height / 2, rc.Right,
  rc.Bottom - size.Height /2);
 g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Bottom - size.Height,
  size.Width, size.Height);
 g.DrawEllipse(p, rc.Right - size.Width, rc.Bottom - size.Height,
  size.Width, size.Height);
 g.DrawLine(p, rc.Right - size.Width / 2, rc.Bottom,
  rc.Left + size.Width / 2, rc.Bottom);
 g.FillEllipse(fillBrush, rc.Left, rc.Bottom - size.Height,
  size.Width, size.Height);
 g.DrawEllipse(p, rc.Left, rc.Bottom - size.Height,
  size.Width, size.Height);
 g.DrawLine(p, rc.Left, rc.Bottom - size.Height / 2,
  rc.Left, rc.Top + size.Height / 2);
 g.FillEllipse(fillBrush. rc.Left, rc.Top, size.Width, size.Height);
  g.DrawEllipse(p, rc.Left, rc.Top, size.Width. size.Height);
 // заполняем прямоугольник, скрывая внутренние эллипсы
 g.FillPolygon(fillBrush, points);
 // освобождаем ресурсы
 fillBrush.Dispose();
}
private void butDrawRoundedRectangle_Click(object sender, EventArgs e) {
 Graphics g = CreateGraphics();
 Rectangle rc = new Rectangle(10, 10, 200, 50);
 DrawRoundedRectangle(g,
  new Pen(Color.Black), Color.CadetBlue, rc, new Size(8, 8));
}

Результат работы этого кода показан на рис. 6.8.


Рис. 6.8. Отображение закрашенного прямоугольника со скругленными углами

Оглавление книги


Генерация: 2.913. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз