Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 890 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 15:

Вывод текста в клиентскую область формы

Упражнение 5.Прокрутка без использования элементов управления

Ключ к созданию автопрокрутки без использования дочерних элементов управления - в установке наследуемому формой свойству AutoScrollMinSize ненулевого значения (0,0 устанавливается по умолчанию). Обычно область прокрутки основывается на положении и размере элементов управления в клиентской области формы. Однако AutoScrollMinSize задает минимальную область прокрутки независимо от наличия на форме элементов управления. И, конечно, нужно задать наследуемому формой свойству AutoScroll значение true.

Обычно значение свойства AutoScrollMinSize задается равным размерам, необходимым для отображения всей выводимой информации. В нашей программе, отображающей сведения о системе, свойство AutoScrollMinSize должно быть установлено так, чтобы вместить высоту и ширину всех 60 строк текста. Такие размеры мы задавали для элемента управления Panel в предыдущем листинге. Приведенный ниже вариант программы по своей работе идентичен предыдущей, но дочерний элемент Panel в ней отсутствует. Не забывайте, что мы продолжаем использовать разработанный нами ранее класс SysInfoStrings.

  • Откройте созданную нами ранее заготовку файла SysInfoScroll.cs
  • Заполните файл SysInfoScroll.cs следующими кодом
public class SysInfoScroll : Form
  {
    // Переменные-члены класса
    Single xCol;
    int linespacing;
  
    public SysInfoScroll()
    {
      // Начальные настройки формы
      this.Text = "Прокрутка без элементов управления";
      // this.BackColor = SystemColors.Window;
      BackColor = Color.MediumSpringGreen;
      this.ForeColor = SystemColors.WindowText;
  
      // Временно создать, чтобы измерить
      Graphics gr = this.CreateGraphics();
      // Замерим длину пробела
      SizeF sizeF = gr.MeasureString(" ", Font);
      // Определим позицию второй колонки
      xCol = sizeF.Width 
        + SysInfoStrings.MaxLabelWidth(gr, Font);
      linespacing = Font.Height;
  
      // Установить свойства автопрокрутки
      this.AutoScroll = true;// Включить автопрокрутку в форме
      // Надбавка к области для скролирования формы
      this.AutoScrollMargin = new Size(10, 10);
      // Установить размеры свойства равными документу
      SizeF size_F = new SizeF(
        xCol + SysInfoStrings.MaxValueWidth(gr, Font),
        linespacing * SysInfoStrings.Count);
      // Округлить до целого
      this.AutoScrollMinSize = Size.Ceiling(size_F);
  
      // Освободить занимаемые временным графическим объектов ресурсы
      gr.Dispose();
    }
  
    // Следующую строку написать вручную!!!
    protected override void OnPaint(PaintEventArgs e)
    {
      Graphics gr = e.Graphics;
      SolidBrush brush = new SolidBrush(this.ForeColor);
      // Длина массива свойств
      int count = SysInfoStrings.Count;
      // Локальные ссылки на массивы через статические свойства
      String[] strArrayLabels = SysInfoStrings.Labels;
      String[] strArrayValues = SysInfoStrings.Values;
  
      // Выводим все строки на клиентскую область формы. Если  
      // часть из них не поместится, то появятся полосы прокрутки 
      Point point = this.AutoScrollPosition; // Копируем в структуру
      for(int i = 0; i < count; i++)
      {
        gr.DrawString(strArrayLabels[i],
          Font, brush,
          point.X, point.Y + i * linespacing);
        gr.DrawString(strArrayValues[i],
          Font, brush, 
          point.X + xCol, point.Y + i * linespacing);
      }
  
      base.OnPaint (e);
    }
  }
Листинг 15.20. Прокрутка без использования элементов управления в классе SysInfoScroll.cs

В данной программе мы вместо создания делегата и обработчика события Paint перегружаем метод OnPaint() формы, поэтому

  • Создайте вручную в конце класса SysInfoScroll код перегрузки метода OnPaint() формы и заполните его тело так
public class SysInfoScroll : Form
  {
  ..............................................................

    // Следующую строку написать вручную!!!
    protected override void OnPaint(PaintEventArgs e)
    {
      Graphics gr = e.Graphics;
      SolidBrush brush = new SolidBrush(this.ForeColor);
      // Длина массива свойств
      int count = SysInfoStrings.Count;
      // Локальные ссылки на массивы через статические свойства
      String[] strArrayLabels = SysInfoStrings.Labels;
      String[] strArrayValues = SysInfoStrings.Values;
  
      // Выводим все строки на клиентскую область формы. Если  
      // часть из них не поместится, то появятся полосы прокрутки 
      Point point = this.AutoScrollPosition; // Копируем в структуру
      for(int i = 0; i < count; i++)
      {
        gr.DrawString(strArrayLabels[i],
          Font, brush,
          point.X, point.Y + i * linespacing);
        gr.DrawString(strArrayValues[i],
          Font, brush, 
          point.X + xCol, point.Y + i * linespacing);
      }
  
      base.OnPaint (e);
    }
  }
Листинг 15.21. Перегрузка метода OnPaint() формы в классе SysInfoScroll.cs

Генерируемая приведенным кодом форма будет выглядеть так


При появлении полос прокрутки клиентская область программы сразу уменьшается ровно на столько, сколько станет занимать появившееся полоса прокрутки. Функция DrawString() объекта Graphics ничего не знает о полосах прокрутки и готова выводить информацию в клиентскую область с самого начала документа, поэтому позицию вывода документа в видимую часть клиентской области нужно корректировать. Это делается на основе свойства AutoScrollPosition.