C# 利用 Time 組件實現 Button 控件的長按功能


  參考鏈接:https://blog.csdn.net/yongh701/article/details/50134379

  如果在C#窗體,單純點擊按鈕,之后將鼠標長時間放在這個按鈕上,不放開,雙擊按鈕默認產生的click事件是不會出現多次相應的。雙擊按鈕默認產生的click事件只會在鼠標點擊按鈕,再松開按鈕,這樣才會執行其中的代碼一次,無論你將點擊之后,鼠標在按鈕懸停多久,都不會相應的,會直到你松開未知。

  長按按鈕效果如下圖,長按 + 數字會一直增加,長按 — 數字會一直減少:

 

實現步驟如下:

 

  1、要實現這樣的功能,我們先拉兩個按鈕控件到窗體中(若項目建立后沒有工具箱可以在視圖里調出)

  

  

  2、拉4個定時器組件到窗體中,每個按鈕到時候要用到兩個定時器

  

 

   3、單擊一下Button1按鈕——>選擇屬性框里的事件——>選擇鼠標事件——>選擇按下跟放開的鼠標事件為Button1

  

  這里如果點擊MouseDown跟MouseUp沒有選項選擇的話,可以先選擇 “ 操作 ” 事件里的MouseClick為button1_MouseDown,這樣在 “ 鼠標 ” 事件那里MouseDown就有button1選項選擇了,不過要注意:在鼠標事件MouseDown里選擇好button1后,要刪除“ 操作 ” 事件里的MouseClick為button1_MouseDown,不然會每單次點擊按鈕的時候,按鈕會執行兩次點擊操作。

  

 

  4、准備工作做好了,不要雙擊按鈕,那樣會生成Click事件,我們雙擊所有的定時器,產生定時器事件,然后回去屬性窗口,雙擊鼠標事件里的,button1_MouseDown跟button1_MouseUp形成事件。

 

  5、接着在各個事件里添加代碼,代碼邏輯是:按下按鈕后,檢測到按下,就執行一次按下的代碼,同時開啟定時器1,定時2S;然后如果鼠標立即松開的話,就關閉定時器,只執行一次按下操作;如果鼠標沒有松開,定時到2S后,開啟定時器2,定時0.05S,並關閉定時器1,接着在鼠標按着的這段時間里每0.05S執行一次定時器2事件里的代碼,直到鼠標松開時關閉定時器。

  先添加 button1_MouseDown 事件里的代碼,里面添加按下一次時執行的代碼跟開啟定時器2,定時2S

       int but = 0;
        //button1部分
        private void button1_MouseDown(object sender, MouseEventArgs e)//一旦用戶按下button1
        {
            but++; 
            Console.WriteLine(" but1 = " + but);//點擊的時候執行一次該代碼
            timer2.Interval = 2000;//timer2_Tick那段代碼每2秒執行一次,初始執行,在2秒之后才正式開始
            timer2.Enabled = true;//開啟timer2
        }

  接着添加定時器2事件里的代碼,這里開啟定時器1,定時0.05s,同時關閉自身,只要鼠標一直按下有2S后就執行這該代碼

        private void timer2_Tick_1(object sender, EventArgs e)
        {
            timer1.Interval = 50;//timer1的代碼每0.05s執行一次
            timer1.Enabled = true;//開始timer1
            //關閉time2,timer2_Tick這段代碼就不要每2秒執行一次了,執行1次就好,這句話就完成timer2與timer1的線程同步
            timer2.Enabled = false;
        }

  然后添加定時器1事件的代碼,這里添加開啟定時器1后,每0.05S執行一次的代碼,執行這里的代碼后,只要鼠標沒有放開,一直按下的話,就會每0.05S執行一次這里的代碼,直到關閉定時器

        private void timer1_Tick_1(object sender, EventArgs e)
        {
            but++;
            Console.WriteLine(" but2 = " + but);//0.05S執行一次該代碼
        }

  最后添加松開鼠標的事件代碼,該代碼主要是關閉定時器,這樣子鼠標松開后,就不會執行定時器的內容了,就達到我松開鼠標時,就不執行那個按鈕的邏輯的目的了

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            //無論用戶在2s內還是在2s之后就松開鼠標,就馬上停止timer3,timer1的代碼執行
            //如果用戶在2s內松開鼠標,time1_Tick根本1次都不會執行
            timer2.Enabled = false;
            timer1.Enabled = false;
        }

  Button3按鈕的實現邏輯跟Button1的一樣,代碼如下

        //button3
        int bu3 = 0;
        private void button3_MouseDown(object sender, MouseEventArgs e)
        {
            bu3++;
            Console.WriteLine(" bu3_1 = " + bu3);//點擊的時候執行一次該代碼
            timer3.Interval = 2000;//timer3_Tick那段代碼每2秒執行一次,初始執行,在2秒之后才正式開始
            timer3.Enabled = true;//開啟timer3
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            timer4.Interval = 50;//timer4的代碼每0.05s執行一次
            timer4.Enabled = true;//開始timer4
            //關閉time3,timer3_Tick這段代碼就不要每2秒執行一次了,執行1次就好,這句話就完成timer3與timer4的線程同步
            timer3.Enabled = false;
        }

        private void timer4_Tick(object sender, EventArgs e)
        {
            bu3++;
            Console.WriteLine(" but3_2 = " + bu3);//0.05S執行一次該代碼
        }

        private void button3_MouseUp(object sender, MouseEventArgs e)
        {
            //無論用戶在2s內還是在2s之后就松開鼠標,就馬上停止timer3,timer4的代碼執行
            //如果用戶在2s內松開鼠標,time3_Tick根本1次都不會執行
            timer3.Enabled = false;
            timer4.Enabled = false;
        }

 

通過上面步驟就可以實現按鈕長按功能了,打印信息效果如下:

  單擊一次按鈕的效果

  

  長按按鈕1再松開的效果

  

  長按按鈕3再松開的效果

  

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM