Говорят: «Хороший программист напишет, гениальный программист найдёт». Я — хороший программист. Печально это или нет, но это так. В который раз уже встречаюсь с той ситуацией, когда приходится тратить время на реализацию какой-нибудь фигни, которая тебе пригодится один раз в жизни и её сто пудов уже кто-нибудь написал, но ты её не можешь найти.
К сожалению, в языке C# — не было реализовано вертикальной шкалы загрузки. Возможно, потому что не правилам и не по канонам создания интерфейсов программ делать шкалу загрузки вертикальной, мы все привыкли к горизонтальной (и желательно слева направо). А мне вот прямо никуда не деться, нужна эта шкала. Поискав в интернете я свыкся с мыслью, что писать придётся самому этот класс. При том написать его красиво, чтобы потом написать эту запись и пафосно выложить его.
Здравствуй, Ищущий, я помогу тебе. Вот, бери код и пользуйся им сколько хочешь. Не думай как он работает, просто пользуйся им! Он не так красив, как стандартный, зато такой же логичный. Им можно пользоваться так же, как стандартным. Достаточно посмотреть на public-члены класса. Они все закомментирован
Только учти, что при переполнении прогресс-бара будет выкидываться исключение ;) Это принципиально. То есть значение 101 ты уже не поставишь.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace MICComponents {
public class VerticalProgressBar : PictureBox {
private int progressValue;
private int endValue;
private Timer timer;
private void constructor(Point point, Size size) {
this.Location = point;
this.Size = size;
this.Paint += new PaintEventHandler(pict_Paint);
this.BorderStyle = BorderStyle.Fixed3D;
progressValue = 0;
endValue = 0;
timer = new Timer();
timer.Interval = 10;
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e) {
if (progressValue < endValue) {
progressValue++;
this.Invalidate();
}
if (progressValue > endValue) {
progressValue--;
this.Invalidate();
}
if (progressValue == endValue) {
timer.Stop();
}
}
public int Value { // почти асболютный аналог свойства Value в классе ProgressBar
get {
return endValue;
}
set {
if (value == 0) {
progressValue = value;
endValue = value;
this.Invalidate();
return;
}
if ((value > 100) || (value < 0)) {
throw new Exception("Неверный ввод числа!");
}
endValue = value;
timer.Start();
}
}
public void Increment(int value) { // увеличение значения шкалы на определённую величину
if (((endValue + value) > 100) || ((endValue + value) < 0)) {
endValue = 100;
return;
}
endValue += value;
timer.Start();
}
private int getPercents() {
return (int)((float)this.Height * (float)progressValue / 100);
}
private void pict_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
DrawRectangle(g, 0, this.Height - getPercents(), this.Width, getPercents());
}
public VerticalProgressBar() { // конструктор без параметров
constructor(new Point(0, 0), new Size(50, 200));
}
public VerticalProgressBar(Point point) { // конструктор с координатами
constructor(point, new Size(50, 200));
}
public VerticalProgressBar(Size size) { // конструктор с размерами
constructor(new Point(0, 0), size);
}
public VerticalProgressBar(int x, int y, int widht, int height) { // хороший конструктор
constructor(new Point(x, y), new Size(widht, height));
}
public VerticalProgressBar(Point point, Size size) { // ещё один хороший конструктор
constructor(point, size);
}
private void DrawRectangle(Graphics g, int x, int y, int widht, int height) {
Rectangle pict = new Rectangle(0, 0, this.Width, this.Height);
System.Drawing.Drawing2D.LinearGradientBrush empty = new System.Drawing.Drawing2D.LinearGradientBrush(pict, Color.Gray, Color.White, System.Drawing.Drawing2D.LinearGradientMode.Horizontal);
g.FillRectangle(empty, pict);
Rectangle rec = new Rectangle(x, y, widht, height);
if ((widht != 0) && (height != 0)) {
System.Drawing.Drawing2D.LinearGradientBrush gradient = new System.Drawing.Drawing2D.LinearGradientBrush(rec, Color.FromArgb(251, 188, 59), Color.White, System.Drawing.Drawing2D.LinearGradientMode.Horizontal);
g.FillRectangle(gradient, rec);
return;
}
Brush brush = new SolidBrush(Color.FromArgb(251, 188, 59));
g.FillRectangle(brush, rec);
}
}
}
Если добавить экземпляр этого класса, прямо в файл Form1.Designer.cs. и скомпилировать, то Visual Studio сама добавит его в дизайнер интерфейса и им можно будет управлять, как стандартным элементом.
Вы увидите эту шкалу-загрузки во второй версии Ё-приложения, которая выйдет в конце января, а также чуть позже выпустим add-in для Visual Studio, который будет добавлять этот прогрессбар, как стандартный элемент в ToolBox. А может сможем сделать, чтобы стандартный прогресс-бар принимал вертикальные и горизонтальные позиции. Посмотрим, вообщем =)