Глаза, которые следят за мышью в 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 пути от центра глаза к краю. Затем рутина рисует зрачок, центрированный в этом положении. Р>
