Создаем форму с информацией о ходе выполнения действий
Часто встречаются ситуации, когда приложение долго выполняет какое-то действие. Если приложение не информирует пользователя и не подает никаких «признаков жизни», то пользователь может прервать его работу. Поэтому нужно как-то информировать пользователя, что приложение работает.
Для информирования пользователя о ходе выполнения работы можно использовать элемент прогресс бар, рассположенный на форме. Ниже представлю пример, который открывает форму и задает ей тень.
Итак, создаем новую форму. На форме создаем два контрола 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;
Результат работы:
Популярность: 9%
Если у вас возникли вопросы, вы можете оставить их в комментариях

