Member 13920025 Ответов: 2

Как закодировать эти правила для колесика мыши вверх/вниз, чтобы управлять уменьшением/увеличением временного значения?


У меня есть значение int -может быть получено как intopacitylevel- то, что контролирует непрозрачность элемента на форме. Когда я запускаю свое приложение, значение устанавливается на число случайного диапазона 1 - 255.
Как я могу собрать следующее Вместе в качестве решения для колесика мыши в c#?: я хочу, чтобы перемещение mwheel вверх или вниз постоянно меняло значение непрозрачности на минимальное или максимальное значение в зависимости от направления движения mwheel, добавляя/вычитая 1 к текущему значению каждые 1 мс.
Именно такое поведение:
Для направления вверх стоп-значение увеличивается только тогда, когда mwheel был перемещен на следующую точку вверх или когда значение находится на максимальном уровне 255. Для направления вниз стоп-значение уменьшается только тогда, когда колесо M было перемещено на следующую точку вниз или когда значение находится на минимальном уровне 1.
This .gif показывает результат, который я хочу: на этом месте была картина из прошлого

Что я уже пробовал:

Я новичок в c#, и я не очень уверен или очень гибок с вариантами, которые у меня есть.
Во - первых, я не уверен, как я должен определить конкретные правила колесика мыши и в сочетании с таймером?/флаг? чтобы правильно уменьшить/увеличить значение.
Я думаю, что нашел способ проверить, двигается ли колесо мыши вверх или вниз, по крайней мере.
Я не уверен, есть ли смысл начинать так, но это был мой первый подход в правильном направлении в конечном итоге.
private void Form1_MouseWheel(object sender, MouseEventArgs e)
{
  int mousedeltaval = e.Delta / 120
   if (mousedeltaval == 1) //mousewheel up move
   {
   }
   if (mousedeltaval == -1) //mousewheel down move
   {
   }
}

2 Ответов

Рейтинг:
12

RickZeeland

Третья попытка:

public partial class Form1 : Form
{
    Timer myTimer = new Timer();
    int mousedeltaval = 0;
    bool running;

    public Form1()
    {
        InitializeComponent();
        myTimer.Interval = 100;
        myTimer.Tick += MyTimerTick;
        this.panel1.MouseWheel += MyMouseWheel;
    }

    /// <summary>
    /// Change the transparency of panel1.
    /// </summary>
    private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (running)
        {
            running = false;
            myTimer.Stop();
            System.Threading.Thread.Sleep(100);
        }
        else
        {
            if (e.Delta < 0)
            {
                mousedeltaval = -10;
            }
            else
            {
                mousedeltaval = 10;
            }

            running = true;
            myTimer.Start();
        }
    }

    private void MyTimerTick(Object myObject, EventArgs myEventArgs)
    {
        int alpha = this.panel1.BackColor.A + mousedeltaval;

        if (alpha > -1 && alpha < 255)
        {
            this.panel1.BackColor = Color.FromArgb(alpha, this.panel1.BackColor);
            this.panel1.Invalidate();
        }

        if (alpha < 1 || alpha > 254)
        {
            running = false;
            myTimer.Stop();
        }
    }
}

Чтобы уменьшить мерцание, см.: рисование - как остановить мерцание C# winforms - переполнение стека[^]


Member 13920025

Спасибо. Я протестировал код в новой форме, но не вижу никакого эффекта.
Я должен сделать что-то не так(временно добавил код моей формы 1 к вопросу).
Я добавил в окно "panel1" с красным цветом задней панели в режиме конструктора, перетащил "timer1" на panel1.
Что еще я могу здесь пропустить?
В текущем решении ожидаемым результатом будет то, что mousewheel up постоянно увеличивает уровень непрозрачности "panel1", следующий mousewheel up останавливает его, а когда значение равно 255, автоматически останавливается и противоположное поведение с mousewheel down и минимальным значением 1?

RickZeeland

Вам не нужно перетаскивать таймер на форму, так как он полностью определен в коде. при использовании колесика мыши вверх и вниз прозрачность должна измениться.

Member 13920025

ОК. Что еще может быть не так, если ошибки нет в коде?
Я добавил код form1 в новый проект и panel1 в окно с красным задним цветом.

RickZeeland

Плохая мышь :)

Member 13920025

Может быть, проблема с фокусом, когда мышь полностью функциональна?

RickZeeland

Я тестировал его на ноутбуке, и он не работал правильно, я обновлю решение !

RickZeeland

Готово !

Member 13920025

Это правильное поведение. Еще раз спасибо!
Похоже, я испытываю небольшую проблему при тестировании вашей идеи.
Остановка значения с помощью колесика мыши работает только с запущенным bool, но здесь переключение с одного направления колесика мыши на другое по какой-то причине останавливает значение, но эта часть работает правильно без запущенного bool.

Member 13920025

Огромное спасибо! Теперь все проблемы решены. Ваш пример был очень полезен.

Member 13920025

У вас есть идея, как я мог бы создать такую же настройку с таймером и колесом мыши для моего нового вопроса?
Я начал новую тему здесь: Как использовать колесо мыши и таймер для автоматической настройки значения?
Я смог напрямую настроить значение с помощью колесика мыши, но я не уверен, как управлять этим значением автоматически с помощью таймера и использовать колесо мыши для косвенного управления, чтобы добиться того же поведения.

Рейтинг:
1

RickZeeland

Вы не можете изменить фон форм таким образом, но вы можете сделать это для панели:

public Form1()
{
    InitializeComponent();
    this.panel1.MouseWheel += MyMouseWheel;
}

private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
    int mousedeltaval = e.Delta / 12;
    int alpha = this.panel1.BackColor.A + mousedeltaval;

    if (alpha > -1 && alpha < 255)
    {
        this.panel1.BackColor = Color.FromArgb(alpha, this.panel1.BackColor);
        this.panel1.Invalidate();
    }
}


Member 13920025

Пока что спасибо, но это не ответ на вопрос, который я думаю.
Я не спрашивал конкретно, как контролировать непрозрачность на форме.
Элемент управления непрозрачностью прекрасно работает с фоновым изображением формы, оно уже определено как intopacityvalue.
Я использовал вызов .dll в качестве собственного решения, чтобы сделать это возможным.
Я хотел бы видеть решение, которое работает с моим уже как int определенным значением intopacityvalue и поведением событий колесика мыши, которое я объяснил выше, чтобы увеличить/уменьшить значение на 1 мс и остановиться при правильных условиях.
Возможно, я ошибаюсь, но это не похоже на первый ответ, который я получил, пока все решает.

RickZeeland

Ах, теперь я вижу, что вы хотите с таймером, я посмотрю, что я могу сделать :)

Member 13920025

Большое спасибо.