Member 13920025 Ответов: 1

Как использовать колесо мыши и таймер для автоматической настройки значения?


Мне нужна помощь еще раз с той же проблемой в основном.
Я настраиваю непрозрачность своей формы с помощью многоуровневого стиля Windows и могу ссылаться на значение с помощью GWL_EXSTYLE для управления уровнем непрозрачности. Я не знаю, почему у меня возникли проблемы здесь, но с моим решением до сих пор я не уверен, как я должен получить текущий уровень непрозрачности формы и настроить его автоматически с помощью таймера. Я пытаюсь создать управляющее поведение с помощью колесика мыши и таймера.
RickZeeland опубликовал полностью функциональный пример правильного поведения с обычной непрозрачностью панели здесь.
Именно этого я и пытаюсь достичь. Если бы кто-то мог помочь мне реализовать решение в этой довольно минималистичной установке со слоистыми окнами, которые я подготовил, я мог бы наконец закончить одно из моих приложений, которое может обрабатывать еще более сложные изображения.

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

Я понял, как управлять непрозрачностью формы непосредственно с помощью колесика мыши, но мне нужна помощь в правильном поведении для автоматического управления значениями с помощью таймера.
this.MouseWheel += MyMouseWheel;

[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
 private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
 private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

[DllImport("user32.dll")]
 static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey,
byte bAlpha, uint dwFlags);

 public const int GWL_EXSTYLE = -20;
 public const int WS_EX_LAYERED = 0x80000;
 public const int LWA_ALPHA = 0x2;


private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);

 int alpha2 = mousedeltaval + 255;
 var alpha = (byte)alpha2;
 SetLayeredWindowAttributes(Handle, 0, alpha, LWA_ALPHA);

   if (e.Delta < 1)
     if (alpha2 > 1)
     {
      mousedeltaval = mousedeltaval - 1;
     }
   if (e.Delta > 1)
      if (alpha2 < 254)
      {
       mousedeltaval = mousedeltaval + 1;
}}}

Richard MacCutchan

Вы должны опубликовать это как ответ на объяснение Рикзиленда, чтобы он мог вам помочь.

Member 13920025

Ладно, спасибо за совет.

1 Ответов

Рейтинг:
10

RickZeeland

Вы были близки !

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WinMouse1
{
    /// <summary>
    /// Change the transparency of the form using the mousewheel
    /// </summary>
    public partial class Form2 : Form
    {
        [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
        private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
        private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

        [DllImport("user32.dll")]
        static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

        public const int GWL_EXSTYLE = -20;
        public const int WS_EX_LAYERED = 0x80000;
        public const int LWA_ALPHA = 0x2;

        Timer myTimer = new Timer();
        int mousedeltaval = 0;
        int alpha = 255;
        bool running;

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

        private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (running)
            {
                running = false;
                myTimer.Stop();
                System.Threading.Thread.Sleep(50);
                return;
            }

            if (e.Delta < 0)
            {
                mousedeltaval = -10;
            }
            else
            {
                mousedeltaval = 10;
            }

            running = true;
            System.Threading.Thread.Sleep(50);
            myTimer.Start();
        }

        private void MyTimerTick(Object myObject, EventArgs myEventArgs)
        {
            alpha += mousedeltaval;

            if (alpha > -1 && alpha < 255)
            {
                SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
                SetLayeredWindowAttributes(Handle, 0, (byte)alpha, LWA_ALPHA);
                return;
            }

            if (alpha < 0)
            {
                alpha = 0;
            }
            else
            {
                alpha = 255;
            }

            running = false;
            myTimer.Stop();
            Debug.Print("alpha = " + alpha);
        }
    }
}