Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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