Глаза, которые следят за мышью в C#
В этом примере используется Timer с именем tmrTick для отслеживания мыши. Его обработчик событий Tick, который показан в следующем коде, обновляет глаза.
// Предыдущее местоположение мыши. private Point OldMousePos = new Point(-1, -1); // Посмотрим, перемещена ли мышь. private void tmrTick_Tick(object sender, EventArgs e) { // Посмотрим, перемещен ли курсор. Point new_pos = Control.MousePosition; if (new_pos.Equals(OldMousePos)) return; OldMousePos = new_pos; // Перерисовать. this.Invalidate(); }
Обработчик событий Tick использует метод MousePosition для отслеживания положения мыши. Если позиция изменилась с момента последнего запуска этого обработчика событий, код аннулирует форму, чтобы следующий обработчик события Paint перерисовал форму.
// Нарисуйте глаза. private void Form1_Paint(object sender, PaintEventArgs e) { DrawEyes(e.Graphics); }
Обработчик событий Paint просто вызывает метод DrawEyes, показанный в следующем коде.
// Нарисуйте глаза. private void DrawEyes(Graphics gr) { // Преобразование позиции курсора в единицы формы. Point local_pos = this.PointToClient(OldMousePos); // Рассчитаем размер глаза. int hgt = (int)(this.ClientSize.Height * 0.9); int wid = (int)(this.ClientSize.Width * 0.45); // Найдите положения глаз. int y = (this.ClientSize.Height - hgt) / 2; int x1 = (int)((this.ClientSize.Width - wid * 2) / 3); int x2 = wid + 2 * x1; // Создаем растровое изображение, на котором можно рисовать. gr.SmoothingMode = SmoothingMode.AntiAlias; gr.Clear(this.BackColor); // Нарисуйте глаза. DrawEye(gr, local_pos, x1, y, wid, hgt); DrawEye(gr, local_pos, x2, y, wid, hgt); }
Метод DrawEyes выполняет некоторые вычисления, чтобы увидеть, где глаза должны быть нарисованы, чтобы они отслеживали положение мыши. Он использует метод PointToClient, чтобы преобразовать позицию мыши в систему координат формы. Затем он вычисляет размер глаз, определяет их позиции и дважды вызывает следующий метод DrawEye, чтобы нарисовать глаза.
private Pen ThickPen = new Pen(Color.Black, 3); ... // Нарисуем глаз. private void DrawEye(Graphics gr, Point local_pos, int x1, int y1, int wid, int hgt) { // Рисуем наружу. gr.FillEllipse(Brushes.White, x1, y1, wid, hgt); gr.DrawEllipse(ThickPen, x1, y1, wid, hgt); // Найдите центр глаза. int cx = x1 + wid / 2; int cy = y1 + hgt / 2; // Получить единичный вектор, указывающий на позицию мыши. double dx = local_pos.X - cx; double dy = local_pos.Y - cy; double dist = Math.Sqrt(dx * dx + dy * dy); dx /= dist; dy /= dist; // Этот момент равен 1/4 пути // от центра к краю глаза. double px = cx + dx * wid / 4; double py = cy + dy * hgt / 4; // Нарисуем эллипс 1/2 размером глаз // с центром в (px, py). gr.FillEllipse(Brushes.Blue, (int)(px - wid / 4), (int)(py - hgt / 4), wid / 2, hgt / 2); }
Метод DrawEye рисует белую внешность для глаза. Затем он вычисляет единичный вектор, указывающий от центра глаза к текущему положению мыши. Он движется в этом направлении на 1/4 пути от центра глаза к краю. Затем рутина рисует зрачок, центрированный в этом положении. Р>