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

Движение мыши

А теперь рассмотрим событие MouseMove. Хотя следующая программа называется MouseWeb, она не имеет ничего общего с World Wide Web. Она лишь переопределяет метод OnMouseMove, чтобы нарисовать «паутинку» из линий, соединяющих текущую позицию мыши с углами и краями клиентской области.

MouseWeb.cs

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

  class MouseWeb: Form
  {
      Point ptMouse = Point.Empty;

      public static void Main()
      {
          Application.Run(new MouseWeb());
      }
      public MouseWeb()
      {
          Text = "Mouse Web";
          BackColor = SystemColors.Window;
          ForeColor = SystemColors.WindowText;
          ResizeRedraw = true;
      }
      protected override void OnMouseMove(MouseEventArgs mea)
      {
          Graphics grfx = CreateGraphics();

          DrawWeb(grfx, BackColor, ptMouse);
          ptMouse = new Point(mea.X, mea.Y);
          DrawWeb(grfx, ForeColor, ptMouse);

          grfx.Dispose();
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          DrawWeb(pea.Graphics, ForeColor, ptMouse);
      }
      void DrawWeb(Graphics grfx, Color clr, Point pt)
      {
          int cx  = ClientSize.Width;
          int cy  = ClientSize.Height;
          Pen pen = new Pen(clr);

          grfx.DrawLine(pen, pt, new Point(         0,          0));
          grfx.DrawLine(pen, pt, new Point(    cx / 4,          0));
          grfx.DrawLine(pen, pt, new Point(    cx / 2,          0));
          grfx.DrawLine(pen, pt, new Point(3 * cx / 4,          0));
          grfx.DrawLine(pen, pt, new Point(    cx    ,          0));
          grfx.DrawLine(pen, pt, new Point(    cx    ,     cy / 4));
          grfx.DrawLine(pen, pt, new Point(    cx    ,     cy / 2));
          grfx.DrawLine(pen, pt, new Point(    cx    , 3 * cy / 4));
          grfx.DrawLine(pen, pt, new Point(    cx    ,     cy    ));
          grfx.DrawLine(pen, pt, new Point(3 * cx / 4,     cy    ));
          grfx.DrawLine(pen, pt, new Point(    cx / 2,     cy    ));
          grfx.DrawLine(pen, pt, new Point(    cx / 4,     cy    ));
          grfx.DrawLine(pen, pt, new Point(         0,     cy    ));
          grfx.DrawLine(pen, pt, new Point(         0,     cy / 4));
          grfx.DrawLine(pen, pt, new Point(         0,     cy / 2));
          grfx.DrawLine(pen, pt, new Point(         0, 3 * cy / 4));
      }
  }

Попробуйте подвигать курсор по клиентской области — центр нарисованной программой паутинки будет следовать за ним. Это выглядит примерно так:


Рис. 8.1.

Первый раз программа рисует паутинку при исполнении метода OnPaint, используя структуру Point, хранимую как поле и инициализированную значением (0, 0). При исполнении метода OnMouseMove программа стирает предыдущую фигуру, перерисовывая ее цветом фона. Затем программа рисует новую паутинку на основе новой позиции мыши, на этот раз — цветом изображения.

Программа прекращает реагировать на движения мыши при выходе курсора за пределы клиентской области. Даже если провести курсор над заголовком окна программы, вызовы метода OnMouseMove прекращаются.

Или это не так? Попробуйте сделать следующее: верните курсор в клиентскую область MouseWeb. Центр паутинки следует за мышью, как обычно. А теперь нажмите одну из кнопок мыши и, не отпуская ее, выведите курсор за пределы клиентской области. Паутинка продолжает следовать за курсором! А теперь отпустите кнопку. Программа вновь перестала реагировать на мышь. Вы только что увидели функцию захвата мыши (mouse capture), очень важную для отслеживания позиции курсора.


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

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