Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7648 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 6:

Работа с печатью и изображениями

Автоматическое преобразование размера и прокручивание изображения

При создании приложения Picture Viewer нашей задачей была печать содержимого PictureBox, и мы не слишком обращали внимание на внешний вид изображения, помещаемого в него. Между тем, единственным способом просмотра изображения полностью был выбор режима "Подогнать размер" (StretchImage), который приводил к довольно существенным искажениям (рис. 6.20).

Помещение рисунка в PictureBox без сохранения его пропорций (наверху, приложение Picture Viewer) и с сохранением (внизу)</p>

увеличить изображение
Рис. 6.20. Помещение рисунка в PictureBox без сохранения его пропорций (наверху, приложение Picture Viewer) и с сохранением (внизу)</p>

Кроме того, при выборе режима "Истинный размер" (Normal) на форме не появлялись полосы прокрутки, позволяющие просматривать изображение по частям (рис. 6.21).

При выходе изображения за границы формы необходимы полосы прокрутки

Рис. 6.21. При выходе изображения за границы формы необходимы полосы прокрутки

Конечно, вписанное изображение можно было просматривать, изменяя размер самой формы, но этот способ вряд ли будет устраивать пользователей. Займемся разработкой приложения, обладающего более удобным интерфейсом. Далее я снова местами буду пользоваться транслитом и называть режим S croll Prokrutkoy: дело в том, что мы научимся создавать собственные свойства пользовательского элемента управления, и мне хочется, чтобы они бросались в глаза. Запускаем Visual Studio .NET, создаем новый проект, выбираем шаблон Windows Control Library и называем его PictureElement (рис. 6.22):

Создание проекта пользовательского элемента управления

Рис. 6.22. Создание проекта пользовательского элемента управления

В окне Properties появившейся формы в поле свойства Name вводим NamePictureElement. В окне Solution Explorer изменяем название UserControl1.cs на SolPictureElement.cs. Добавляем на форму элемент управления PictureBox — его размеры будут достаточно маленькими, но это не важно, в дальнейшем мы изменим его размер так, как будет нужно (рис. 6.23).

Элемент управления PictureElement в режиме дизайна

Рис. 6.23. Элемент управления PictureElement в режиме дизайна

Свойству SizeMode элемента управления PictureBox устанавливаем значение StretchImage. Переходим в код формы, в пространстве имен PictureElement создаем перечисление RejimProsmotra:

public enum RejimProsmotra
  {
    Prokrutka,
    PodgonRazmera
  }

В классе формы создаем переменную prosmotrperemen, которая будет определять режим просмотра:

private RejimProsmotra prosmotrperemen;

Создаем свойство Izobrajenie, с помощью которого можно будет помещать изображение в PictureBox элемента:

public Image Izobrajenie
    {
      get{return this.pictureBox1.Image;}
      set
      {
        this.pictureBox1.Image = value;
//Вызываем метод для установки режима просмотра
        this.UstanovkaRejima();
        
      }
    }

Создаем свойство UserPropRejimProsmotra, в котором переменной prosmotrperemen устанавливается значение выбранного режима просмотра:

public RejimProsmotra UserPropRejimProsmotra
    {
      get{return this.prosmotrperemen;}
      set
      {            
        this.prosmotrperemen = value;        
        this.AutoScroll = (this.prosmotrperemen == RejimProsmotra.Prokrutka );    
        //Вызываем метод для установки режима просмотра
        this.UstanovkaRejima();        
      }
    }

В методе PodgonRazmera определяются различные возможные случаи отношений размеров изображения, PictureBox и самого элемента:

private void PodgonRazmera()
    {
      //Определяем переменную ProporciiElementa, которая равна 
      //отношению ширины элемента к его высоте
      float ProporciiElementa = (float)this.Width/this.Height;
      //Определяем переменную ProporciiIzobrajeniya, которая равна 
      //отношению ширины загруженного изображения к его высоте
float ProporciiIzobrajeniya = (float)this.pictureBox1.Image.Width/this.pictureBox1.Image.Height;
      //Если ширина элемента  больше или равна ширине изображения 
      //и высота больше или равна высоте изображения, устанавливаем значения ширины 
      //и высоты pictureBox1 равными ширине и высоте изображения
if ( this.Width >= this.pictureBox1.Image.Width && this.Height >= this.pictureBox1.Image.Height )
      {        
        this.pictureBox1.Width = this.pictureBox1.Image.Width;
        this.pictureBox1.Height = this.pictureBox1.Image.Height;        
      }
      //Иначе, если ширина элемента  больше ширины изображения 
      //и высота меньше высоты  изображения, устанавливаем значение высоты 
      // pictureBox1, равное  высоте  элемента, а  значение ширины — равное значению 
      //ширины изображения 
else if( this.Width > this.pictureBox1.Image.Width && this.Height < this.pictureBox1.Image.Height)
      {
        this.pictureBox1.Height = this.Height;
        this.pictureBox1.Width = (int)(this.Height * ProporciiIzobrajeniya);      
      }
      //Иначе, если ширина элемента  меньше  ширины изображения 
      //и высота больше  высоты  изображения, устанавливаем значение ширины 
      // pictureBox1, равное  ширине  элемента, а  значение высоты — равное значению 
      //высоты изображения 
else if( this.Width < this.pictureBox1.Image.Width && this.Height > this.pictureBox1.Image.Height)
      {        
        this.pictureBox1.Width = this.Width;
        this.pictureBox1.Height = (int)(this.Width / ProporciiIzobrajeniya);                  
      }
      //Иначе, если ширина элемента  меньше  ширины изображения 
      //и высота меньше  высоты  изображения
else if ( this.Width < this.pictureBox1.Image.Width && this.Height < this.pictureBox1.Image.Height )
      {
        //если ширина элемента больше или равна его высоте
        if (this.Width >= this.Height )
        {
      //Если ширина изображения больше или равна его высоте и переменная 
      //ProporciiIzobrajeniya больше или равна переменной ProporciiElementa,
      //устанавливаем значение ширины pictureBox1, равное значению ширины элемента,
      //а значение высоты — равное значению высоты изображения
if ( this.pictureBox1.Image.Width >= this.pictureBox1.Image.Height && ProporciiIzobrajeniya >= ProporciiElementa )
          {
            this.pictureBox1.Width = this.Width;
            this.pictureBox1.Height = (int)(this.Width / ProporciiIzobrajeniya);
          }
      //Иначе, устанавливаем значение высоты  pictureBox1, равное значению
      //высоты элемента, а значение ширины — равное значению ширины изображения
          else
          {              
            this.pictureBox1.Height = this.Height;
this.pictureBox1.Width = (int)(this.Height * ProporciiIzobrajeniya);
          }          
        }
      //Иначе
        else
        {
      //Если ширина изображения меньше  его высоты и переменная 
      //ProporciiIzobrajeniya меньше переменной ProporciiElementa,
      //устанавливаем значение высоты  pictureBox1, равное значению высоты элемента,
      //а значение ширины — равное значению ширины изображения
if ( this.pictureBox1.Image.Width < this.pictureBox1.Image.Height && ProporciiIzobrajeniya < ProporciiElementa )
          {            
            this.pictureBox1.Height = this.Height;
this.pictureBox1.Width = (int)(this.Height * ProporciiIzobrajeniya);
          }
      //Иначе, устанавливаем значение ширины  pictureBox1, равное значению
      //ширины  элемента, а значение высоты — равное значению высоты изображения
          else 
          {                          
            this.pictureBox1.Width = this.Width;
            this.pictureBox1.Height = (int)(this.Width / ProporciiIzobrajeniya);            
          }
        }
      }    
      //Вызываем метод для размещения изображения в центре
      PomeshenieIzobrajeniyavCenter();
    }
Листинг 6.12.

В методе Prokrutka размеры PictureBox устанавливаются равными размерам загруженного изображения:

private void Prokrutka()
    {
    //Устанавливаем значение ширины pictureBox1, равное значению ширины изображения
      this.pictureBox1.Width = this.pictureBox1.Image.Width;
    //Устанавливаем значение высоты pictureBox1, равное значению высоты изображения
      this.pictureBox1.Height = this.pictureBox1.Image.Height;
    //Вызываем метод для установки режима просмотра
      this.PomeshenieIzobrajeniyavCenter();
    }
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/