Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 13:

Класс Control и стандартные элементы управления (обзор)

Графическое окно PictureBox

Этот элемент служит для отображения растров или метафайлов. Изображение задается свойством Image. Свойство SizeMode задает режим отображения с помощью перечисления System.Windows.Forms.PictureBoxSizeMode, которое имеет следующие значения

  • AutoSize - графическое окно подстраивается под размер изображения
  • CenterImage - изображение размещается по центру графического окна
  • Normal - изображение размещается в левом верхнем углу графического окна
  • StretchImage - изображение масштабируется под размер графического окна
  • Zoom - изображение масштабируется внутри графического окна без искажений

Вот пример, для выполнения которого нужно разместить рисунки (прилагаются в каталоге Pictures ) в одной папке с исполнимым файлом.

using System;
using System.Drawing;
using System.Windows.Forms;
    
class MyClass : Form
{
    PictureBox pictureBox;
    string[] photo = {
                      "Photo.bmp",
                      "Photo.jpg",
                      "Photo.png"
                     };
    
    public MyClass()
    {
        // Загрузили иконку
        this.Icon = new Icon("1.ICO");
        // Текст заголовка окна
        this.Text = "Испытание элемента PictureBox";
        // Подписались на события формы
        this.Click += FormClick;
        this.Paint += BeginPaint;
    
        pictureBox = new PictureBox();// Создали элемент
        pictureBox.Parent = this;// Назначили родителя
        // Распахнули на всю форму
        pictureBox.Dock = DockStyle.Fill;
        // Масштабировать без искажений
        pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
        // Чтобы не заслонял текстовое сообщение на форме
        pictureBox.Visible = false;
        // Подписываем на щелчки элемента тот же обработчик
        pictureBox.Click += FormClick;
    }
    
    void BeginPaint(object sender, PaintEventArgs e)
    {
        // Создаем и настраиваем точку привязки текстового блока
        StringFormat strfrm = new StringFormat();
        strfrm.Alignment = StringAlignment.Center;// Центр по горизонтали
        strfrm.LineAlignment = StringAlignment.Center;// Центр по вертикали
    
        // Создаем временный объект для доступа к контексту устройства
        Graphics gr = Graphics.FromHwnd(this.Handle);
        gr.DrawString("Щелкайте на форме",  // Текст сообщения
            new Font("Arial", 14, FontStyle.Bold), // Шрифт сообщения
            new SolidBrush(Color.Red),  // Цвет шрифта
            this.ClientSize.Width / 2,   // Центр клиентской области по горизонтали
            this.ClientSize.Height / 2,  // Центр клиентской области по вертикали
            strfrm); // Передаем точку привязки текстового блока  
        gr.Dispose();// Освободили контекст устройства
    }
    
    int count = 0;// Счетчик
    bool clickFlag = false; // Устанавливается при первом щелчке
    void FormClick(object sender, EventArgs e)
    {
        if (!clickFlag)
        {
            pictureBox.Visible = true;
            this.Paint -= BeginPaint;// Разрегистрируем обработчик
            clickFlag = true;
        }
    
        //pictureBox.Image = Image.FromFile(photo[count++]);
        pictureBox.Load(photo[count++]);
        count = count < photo.Length ? count : 0;// Однострочное условие
    }
}
Листинг 13.11.

Метод Load() принимает URL или имя файла. Метод LoadAsync() выполняет загрузку в фоновом режиме, создавая дополнительный поток, и информирует о завершении событием LoadCompleted, например,

pictureBox.LoadAsync(@"http://localhost/print.jpg");

Если изображение загружается долго, то можно задать дежурную картинку в свойстве InitialImage, а также картинку в свойстве ErrorImage, выводимую в случае ошибки загрузки. Событие LoadProgressChanged в своем аргументе типа ProgressChangedEventArgs передает информацию о загрузке изображения в процентах. Эту информацию можно использовать в обработчике для отображения с помощью индикатора выполнения ProgressBar, например,

void pictureBox_LoadProgressChanged(object sender,    
  ProgressChangedEventArgs e)
{    progressBar.Value = e.ProgressPercentage;}

Индикатор хода процесса ProgressBar

Основные свойства ProgressBar - это целочисленные Minimum, Maximum, Value. Индикатор процесса напрямую связан со свойством Value, значение которого можно увеличивать несколькими способами:

  • Напрямую , например, Value++
  • Методом PerformStep(), увеличивающим при каждом вызове на шаг, заданный в свойстве Step
  • Методом Increment(int value), увеличивающим на величину целочисленного аргумента

Приведем пример, в котором движком процесса является таймер. Код является несколько избыточным, чтобы продемонстрировать побольше из бесконечного числа особенностей объектно-ориентированного программирования.

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    class MyClass : Form
    {
        ProgressBar progressBar = new ProgressBar();
        Timer timer;
        const int INTERVAL_TIME = 1000; // Миллисекунды
    
        public MyClass()
        {
            // Настройка формы
            this.Icon = new Icon("1.ICO");
            this.Text = "Испытание элемента ProgressBar ";
    
            // Настройка индикатора
            progressBar.Parent = this;
            progressBar.Width = this.ClientSize.Width;
            int y = (this.ClientSize.Height - progressBar.Height) / 2;
            progressBar.Location = new Point(0, y);
            progressBar.Minimum = 0;
            progressBar.Maximum = 20;
            progressBar.Step = 1;
            progressBar.Style = ProgressBarStyle.Continuous;
    
            // Настройка кнопки
            Button btn = new Button();
            btn.Parent = this;
            btn.Text = "Start/Stop";
            btn.AutoSize = true;
            btn.Font = new Font("Arial", 12, FontStyle.Italic);
            int x = (this.ClientSize.Width - btn.Width) / 2;
            y = this.ClientSize.Height - btn.Height - 20;
            btn.Location = new Point(x, y);
            btn.Click += new EventHandler(btn_Click);
    
            // Настройка таймера
            timer = new Timer();
            timer.Interval = INTERVAL_TIME;
            timer.Tick += new EventHandler(timer_Tick);
        }
    
        // Обработчик кнопки управления таймером
        bool startTimerFlag = false;
        void btn_Click(object sender, EventArgs e)
        {
            if (!startTimerFlag)
                timer.Start();
            else
                timer.Stop();
    
            startTimerFlag = !startTimerFlag;
        }
    
        // Обработчик тиков таймера 
        void timer_Tick(object sender, EventArgs e)
        {
            if (progressBar.Value < progressBar.Maximum)
            {
                progressBar.PerformStep();
            }
            else
            {
                timer.Stop();
            }
        }
    
        // Деструктор, доступ не управляется
        ~MyClass()
        {
            if (startTimerFlag)
                timer.Stop();
        }
    }
}
Листинг 13.12.
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина