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

Источник: http://csharphelper.com/blog/2017/05/make-silly-eyes-that-track-the-mouse-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector