/// <summary> /// Draw background in list /// </summary> /// <param name="gMem">Graphics</param> /// <param name="rListRect">Client rectangle to fill background</param> /// <param name="offset">Offset for the beginning of the item list</param> protected virtual void DrawBackground(Gdi gMem, Rectangle rListRect, int offset) { if (BackgroundImage != null) gMem.DrawImage(BackgroundImage, 0, 0, rListRect.Width, rListRect.Height); else if (BackColor != Color.Empty) gMem.FillRect(rListRect, BackColor); }
/// <summary> /// Отрисовка /// </summary> protected override void OnRender(Gdi gMem, Rectangle clipRect) { using (Bitmap bmp = new Bitmap(clipRect.Width, clipRect.Height)) { using (Graphics bgr = Graphics.FromImage(bmp)) // Рисуем все в буфере для скорости { SizeF textSize = string.IsNullOrEmpty(Text) ? new SizeF(0, 0) : bgr.MeasureString(Text, Font); Color textColor = SwitchTextColor ? BackColor : ForeColor; // Отрисовка фона if (EmptyImage != null) bgr.DrawImage(_emptyImageBitmap, new Rectangle(0, 0, clipRect.Width, clipRect.Height), new Rectangle(0, 0, _emptyImageBitmap.Width, _emptyImageBitmap.Height), GraphicsUnit.Pixel); // Отрисовка прогресса if (FullImage != null) bgr.DrawImage(_fullImageBitmap, new Rectangle(0, 0, clipRect.Width * Value / Maximum, clipRect.Height), new Rectangle(0, 0, _fullImageBitmap.Width * Value / Maximum, _fullImageBitmap.Height), GraphicsUnit.Pixel); Pen borderPen = new Pen(SwitchTextColor ? Color.FromArgb(88, 97, 114 /*93, 103, 121*/) : Color.Black); if (NeedBorder) { // Обводка прямых краев bgr.DrawLine(borderPen, RoundCornersRadius, 0, Width - RoundCornersRadius, 0); bgr.DrawLine(borderPen, Width - 1, RoundCornersRadius - 2, Width - 1, Height - RoundCornersRadius + 2); bgr.DrawLine(borderPen, RoundCornersRadius - 3, Height - 1, Width + 3 - RoundCornersRadius, Height - 1); bgr.DrawLine(borderPen, 0, RoundCornersRadius, 0, Height - RoundCornersRadius); } //Отрисовка текста float textLeft = (clipRect.Width - textSize.Width) / 2; float textTop = (clipRect.Height - textSize.Height) / 2; if (!string.IsNullOrEmpty(Text)) bgr.DrawString(Text, Font, new SolidBrush(textColor), new RectangleF(textLeft, textTop, textSize.Width, textSize.Height)); // Скругление углов if (RoundCornersRadius > 0) { // Необходимо скругление - вычисление точек границы вырезаемой области int N = 100; List<Point> points = new List<Point>(N + 1); Point[] pointsArray = new Point[N]; points.Add(new Point(0, 0)); // Скругление верхнего левого угла кнопки for (int i = 0; i < N; i++) { int x = i * RoundCornersRadius / (N - 1); int y = (int)(RoundCornersRadius - Math.Round(Math.Sqrt(RoundCornersRadius * RoundCornersRadius - (x - RoundCornersRadius) * (x - RoundCornersRadius)))); points.Add(new Point(x, y)); } bgr.FillPolygon(new SolidBrush(Parent.BackColor), points.ToArray()); if (NeedBorder) { // Обводка верхнего левого угла кнопки points.CopyTo(1, pointsArray, 0, N); bgr.DrawLines(borderPen, pointsArray); } // Скругление верхнего правого угла кнопки for (int i = 0; i < N + 1; i++) { points[i] = new Point(clipRect.Width - points[i].X, points[i].Y); } bgr.FillPolygon(new SolidBrush(Parent.BackColor), points.ToArray()); if (NeedBorder) { // Обводка верхнего правого угла кнопки points.CopyTo(1, pointsArray, 0, N); bgr.DrawLines(borderPen, pointsArray); } // Скругление нижнего правого угла кнопки for (int i = 0; i < N + 1; i++) { points[i] = new Point(points[i].X, clipRect.Height - points[i].Y); } bgr.FillPolygon(new SolidBrush(Parent.BackColor), points.ToArray()); if (NeedBorder) { // Обводка нижнего правого угла кнопки points.CopyTo(1, pointsArray, 0, N); bgr.DrawLines(borderPen, pointsArray); } // Скругление нижнего левого угла кнопки for (int i = 0; i < N + 1; i++) { points[i] = new Point(clipRect.Width - points[i].X, points[i].Y); } bgr.FillPolygon(new SolidBrush(Parent.BackColor), points.ToArray()); if (NeedBorder) { // Обводка нижнего левого угла кнопки points.CopyTo(1, pointsArray, 0, N); bgr.DrawLines(borderPen, pointsArray); } } } gMem.DrawImage(bmp, clipRect.Left, clipRect.Top); } }