Создаем форму с информацией о ходе выполнения действий

И немного рекламы:

Часто встречаются ситуации, когда приложение долго выполняет какое-то действие. Если приложение не информирует пользователя и не подает никаких «признаков жизни», то пользователь может прервать его работу. Поэтому нужно как-то информировать пользователя, что приложение работает.

Для информирования пользователя о ходе выполнения работы можно использовать элемент прогресс бар, рассположенный на форме. Ниже представлю пример, который открывает форму и задает ей тень.

Итак, создаем новую форму. На форме создаем два контрола ProgressBar и Lable. Я их назвал соответственно lblStatus и prgMain. Для обох элементов свойство Modifiers устанавливаем в public. В нашу нувую форму frmProgress добавляем код ниже:

//код тень
private const int CS_DROPSHADOW = 0x00020000;

protected override CreateParams CreateParams
{
	get
	{
		//получаем версию операционной системы
		System.Version OSVer = System.Environment.OSVersion.Version;
		//Проверяем ОС перед использованием
		CreateParams cp = base.CreateParams;

		//проверяем версия операционной системы
		if (OSVer.Major == 5)
		{
			//Определяем, поддерживает ли 2000 показ теней
			if ((OSVer.Minor > 0) && (OSFeature.IsPresent(SystemParameter.DropShadow)))
			{
				//добавляем к стилю тень
				cp.ClassStyle |= CS_DROPSHADOW;
			}
		}
		else if (OSVer.Major >= 5)
		{
			if (OSFeature.IsPresent(SystemParameter.DropShadow))
			{
				cp.ClassStyle |= CS_DROPSHADOW;
			}
		}
		return cp;
	}
}

#region Отображение окна
//активация окна
private const int SW_ACTIVATE = 10;
//вынести поверх всех обычных окон и поверх всех TOP
private const int HWND_TOPMOST = -1;

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
	 int hWnd,              // хэндл окна
	 int hWndInsertAfter,   // z-порядок
	 int X,                 // позиция по горизонтали
	 int Y,                 // позиция по вертикали
	 int cx,                // ширина
	 int cy,                // высота
	 uint uFlags);          // флаг позиции windows

/// <summary>
/// Отображение окна с прогресс баром
/// </summary>
public void OpenWindow()
{
	//определяем позицию окна, чтобы оно отображалось в центре экрана
	int winLeft = SystemInformation.PrimaryMonitorSize.Width / 2 - Width /2;
	int winTop = SystemInformation.PrimaryMonitorSize.Height / 2 - Height /2;
	//устанавливаем позицию по полученным значениям
	SetWindowPos(Handle.ToInt32(), HWND_TOPMOST, winLeft, winTop, Width, Height,SW_ACTIVATE);
	Left = winLeft;
	Top = winTop;
	//показываем окно
	ShowWindow(Handle, SW_ACTIVATE);
}
#endregion

Теперь там, где происходит какое-то длительное действие пишем (т.е. в какой-то функции):

//создаем новую форму
frmProgress prg = new frmProgress();
//устанавливаем максимальное значение для прогресс бара
prg.prgMain.Maximum = 20;
//задаем текст для label
prg.lblStatus.Text = "Тест...";
//текст для формы
prg.Text = "Тестирование";
//показываем окно.
//обычно для отображения окна используются методы Show и ShowDialog
//в данном случае, мы используем свое OpenWindow
prg.OpenWindow();
try
{
	//здесь вставляете ваш код, вместо того, что написан ниже
	for (int i = 0; i <= prg.prgMain.Maximum; i++)
	{
		//увеличиваем значение прогресс бара
		prg.prgMain.Increment(1);
		//даем приложению выполнить действия, которые находятся в очереди
		//требуется, если действия повторяются очень часто и нужно обновлять прогресс бар
		Application.DoEvents();
		//ждем четверть секунды
		Thread.Sleep(250);
	}
}
finally
{
	//закрываем форму
	prg.Close();
}

В начале файла не забудьте добавить объявления:

using System.Runtime.InteropServices;
using System.Threading;

Результат работы:
Форма с ProgressBar

Популярность: 9%

Теги: ,

Если у вас возникли вопросы, вы можете оставить их в комментариях

Оставить комментарий

(обязательно)

(обязательно)


 

MAXCACHE: 0.32MB/0.00034 sec