netlib.narod.ru< Назад | Оглавление | Далее >

Выполнение заливки для перерисовки

Как вы уже видели, фон формы автоматически окрашивается цветом BackColor. Кроме того, можно поменять цвет фона формы иначе — методом Clear класса Graphics. У Clear единственный параметр — объект Color.


Методы Graphics (выборочно)



void Clear(Color color)


Программа RandomClear случайным образом вычисляет новый цвет всякий раз, когда вызывается метод OnPaint, и с помощью метода Clear отображает текст новым цветом.

RandomClear.cs

  //--------------------------------------------
  // RandomClear.cs (C) 2001 by Charles Petzold
  //--------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class RandomClear: Form
  {
      public static void Main()
      {
          Application.Run(new RandomClear());
      }
      public RandomClear()
      {
          Text = "Random Clear";
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics grfx = pea.Graphics;
          Random   rand = new Random();

          grfx.Clear(Color.FromArgb(rand.Next(256),
                                    rand.Next(256),
                                    rand.Next(256)));
      }
  }

Запустите эту программу и поэкспериментируйте, изменяя размер формы. Вы увидите: при увеличении размера формы, неокрашенные полосы в правой и нижней части формы будут изображаться другим цветом. Каждый новый цвет отображается новым вызовом OnPaint. Казалось бы, метод Clear должен очищать всю клиентскую область, но вообще-то его действие ограничивается областью, ставшей недействительной. (Заметьте: если уменьшить размер формы, цвета не изменятся, потому что нет части клиентской области, которая стала недействительной.)

Такое поведение не всегда желательно. Может оказаться, что ваша программа должна делать недействительной всю клиентскую область при изменении размера клиентской области. Ранее я показывал, как это сделать, в программе FormSize этой главы: переопределите метод OnResize и поместите в него вызов Invalidate.

Другое решение — присвоить значение true свойству ResizeRedraw в конструкторе формы:

  ResizeRedraw = true;

Если ResizeRedraw равно true, всякий раз, когда размер клиентской области меняется, клиентская область становится недействительной. В следующей программе показаны эти различия.

RandomClearResizeRedraw.cs

  //--------------------------------------------------------
  // RandomClearResizeRedraw.cs (C) 2001 by Charles Petzold
  //--------------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class RandomClearResizeRedraw: Form
  {
      public static void Main()
      {
          Application.Run(new RandomClearResizeRedraw());
      }
      public RandomClearResizeRedraw()
      {
          Text = "Random Clear with Resize Redraw";
          ResizeRedraw = true;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics grfx = pea.Graphics;
          Random   rand = new Random();

          grfx.Clear(Color.FromArgb(rand.Next(256),
                                    rand.Next(256),
                                    rand.Next(256)));
      }
  }

Я не совсем уверен, стоит ли рекомендовать помещать присваивание ResizeRedraw в каждую программу Windows Forms или даже присваивать это свойство для каждого элемента управления. Эта проблема, вероятно, больше проявляется в данной книге, чем в реальной жизни, так как я предпочитаю писать программы, изменяющие свое содержимое в зависимости от размера клиентской области.

Однако запомните: всякий раз, когда что-нибудь на вашей форме некорректно обновляется, надо подумать о присваивании true свойству ResizeRedraw. А если вы уже установили ResizeRedraw, то проблема заключается в чем-то еще.

Перед завершением работы с программой выполните маленькое упражнение. Поместите в RandomClearResizeRedraw пустое переопределение OnResize:

  protected override void OnResize{EventArgs ea)
  {
  }

Вы обнаружите, что эта программа ведет себя в точности, как RandomClear. Очевидно, метод OnResize, реализованный в Control (и наследуемый Form) отвечает за то, чтобы делать элемент управления недействительным в зависимости от его стиля. Вероятно, OnResize содержит такой код:

  if{ResizeRedraw)
      Invalidate();

По этой и по другим причинам всякий раз при переопределении метода OnResize нужно вызывать метод OnResize, реализованный в базовом классе:

  protected override void OnResize(EventArgs ea)
  {
      base.OnResize(ea);

      // Действия, которые нужно выполнить.
  }

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz