C#實(shí)現(xiàn)winform窗口抖動(dòng)效果的示例代碼
1. 創(chuàng)建 WinForms 項(xiàng)目
首先,確保你已經(jīng)創(chuàng)建了一個(gè) WinForms 項(xiàng)目。如果你還沒(méi)有創(chuàng)建,請(qǐng)按照以下步驟操作:
- 打開(kāi) Visual Studio。
- 選擇“創(chuàng)建新項(xiàng)目”。
- 選擇“Windows Forms App (.NET Framework)”或“Windows Forms App (.NET Core/.NET 6+)”,然后點(diǎn)擊“下一步”。
- 輸入項(xiàng)目名稱(chēng),選擇保存位置,然后點(diǎn)擊“創(chuàng)建”。
2. 添加按鈕和事件處理程序
接下來(lái),我們?cè)诖绑w上添加一個(gè)按鈕,并為其添加點(diǎn)擊事件處理程序。當(dāng)用戶(hù)點(diǎn)擊按鈕時(shí),我們將觸發(fā)窗口抖動(dòng)效果。
- 在設(shè)計(jì)器中,從工具箱中拖拽一個(gè)
Button控件到窗體上。 - 雙擊按鈕,Visual Studio 會(huì)自動(dòng)生成按鈕的點(diǎn)擊事件處理程序。
3. 實(shí)現(xiàn)窗口抖動(dòng)效果
我們可以通過(guò)定時(shí)改變窗口的位置來(lái)實(shí)現(xiàn)抖動(dòng)效果。具體來(lái)說(shuō),我們可以使用 System.Windows.Forms.Timer 來(lái)定期移動(dòng)窗口的位置,使其在水平方向上左右移動(dòng),從而產(chǎn)生抖動(dòng)的效果。
以下是完整的代碼示例:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowShakeEffect
{
public partial class Form1 : Form
{
private Timer shakeTimer;
private int shakeCount = 0;
private const int shakeTimes = 5; // 抖動(dòng)次數(shù)
private const int shakeOffset = 5; // 抖動(dòng)偏移量
private Point originalLocation;
public Form1()
{
InitializeComponent();
InitializeShakeTimer();
}
private void InitializeShakeTimer()
{
shakeTimer = new Timer();
shakeTimer.Interval = 20; // 每20毫秒觸發(fā)一次
shakeTimer.Tick += ShakeTimer_Tick;
}
private void btnShake_Click(object sender, EventArgs e)
{
// 保存原始位置
originalLocation = this.Location;
// 重置抖動(dòng)計(jì)數(shù)
shakeCount = 0;
// 啟動(dòng)定時(shí)器
shakeTimer.Start();
}
private void ShakeTimer_Tick(object sender, EventArgs e)
{
if (shakeCount < shakeTimes * 2) // 乘以2是因?yàn)槲覀円笥腋鞫秳?dòng)一次
{
// 計(jì)算新的位置
int newX = originalLocation.X + (shakeCount % 2 == 0 ? -shakeOffset : shakeOffset);
this.Location = new Point(newX, originalLocation.Y);
shakeCount++;
}
else
{
// 恢復(fù)原始位置并停止定時(shí)器
this.Location = originalLocation;
shakeTimer.Stop();
}
}
}
}4. 解釋代碼
InitializeShakeTimer():初始化一個(gè)Timer對(duì)象,設(shè)置其間隔時(shí)間為 20 毫秒(即每 20 毫秒觸發(fā)一次),并為Tick事件添加處理程序ShakeTimer_Tick。btnShake_Click():這是按鈕的點(diǎn)擊事件處理程序。當(dāng)用戶(hù)點(diǎn)擊按鈕時(shí),保存當(dāng)前窗口的原始位置,重置抖動(dòng)計(jì)數(shù)器,并啟動(dòng)定時(shí)器。ShakeTimer_Tick():這是定時(shí)器的Tick事件處理程序。每次定時(shí)器觸發(fā)時(shí),窗口會(huì)在水平方向上左右移動(dòng),移動(dòng)的距離由shakeOffset決定。抖動(dòng)次數(shù)由shakeTimes決定,每次抖動(dòng)包括向左和向右各移動(dòng)一次,因此總共抖動(dòng)shakeTimes * 2次。抖動(dòng)結(jié)束后,窗口會(huì)恢復(fù)到原始位置,并停止定時(shí)器。
5. 運(yùn)行效果
當(dāng)你運(yùn)行這個(gè)程序并點(diǎn)擊按鈕時(shí),窗體會(huì)在水平方向上輕微地左右移動(dòng),產(chǎn)生抖動(dòng)的效果。你可以通過(guò)調(diào)整 shakeOffset 和 shakeTimes 來(lái)控制抖動(dòng)的幅度和次數(shù),以達(dá)到你想要的效果。
6. 進(jìn)一步優(yōu)化
如果你想讓抖動(dòng)效果更加自然,可以嘗試以下幾種優(yōu)化方法:
隨機(jī)化抖動(dòng)方向:每次抖動(dòng)時(shí)隨機(jī)選擇向左或向右移動(dòng),而不是嚴(yán)格按照順序。
添加垂直抖動(dòng):除了水平抖動(dòng)外,還可以在垂直方向上添加輕微的抖動(dòng),使效果更加立體。
平滑過(guò)渡:使用
System.Windows.Forms.Timer的Interval屬性來(lái)控制抖動(dòng)的速度,或者使用System.Threading.Thread.Sleep來(lái)實(shí)現(xiàn)更平滑的過(guò)渡效果。結(jié)合其他動(dòng)畫(huà)效果:你還可以結(jié)合其他動(dòng)畫(huà)效果,比如縮放、旋轉(zhuǎn)等,使窗口抖動(dòng)更加有趣。
另一種程序?qū)崿F(xiàn)的方法:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private Timer timer;
private int count = 0; //這是一個(gè)計(jì)數(shù)器,用于跟蹤當(dāng)前抖動(dòng)的次數(shù)。每次 Timer 觸發(fā)時(shí),count 會(huì)遞增。
private int count_max = 10; //這是抖動(dòng)的最大次數(shù)。當(dāng) count 達(dá)到 count_max 時(shí),抖動(dòng)結(jié)束。
private int X原始位置; //抖動(dòng)開(kāi)始時(shí)的X原始位置
private int Y原始位置; //抖動(dòng)開(kāi)始時(shí)的Y原始位置
public Form1()
{
InitializeComponent();
// 記錄窗口移動(dòng)時(shí)的原始位置
this.Move += (s, e) =>
{
if (!timer.Enabled)
{
X原始位置 = this.Location.X;
Y原始位置 = this.Location.Y;
}
};
timer = new Timer();
timer.Tick += (s, e) =>
{
Point p = Location;
if ((count & 1) == 0)
{
p.Offset(2, 2); // 向右下角移動(dòng)
}
else
{
p.Offset(-2, -2); // 向左上角移動(dòng)
}
Location = p; // 更新窗口位置
count++;
if (count >= count_max)
{
count = 0;
timer.Stop(); // 停止定時(shí)器
Location = new Point(X原始位置, Y原始位置); // 恢復(fù)原始位置
}
};
timer.Interval = 25; // 設(shè)置定時(shí)器間隔為 25 毫秒
}
private void button1_Click(object sender, EventArgs e)
{
if (!timer.Enabled) //檢查定時(shí)器是否已經(jīng)啟動(dòng)。如果定時(shí)器沒(méi)有啟動(dòng),則允許啟動(dòng)抖動(dòng)效果。
{
timer.Start(); // 啟動(dòng)定時(shí)器
}
}
}
}
實(shí)現(xiàn)方法:
初始化:當(dāng)窗體加載時(shí),
Form1構(gòu)造函數(shù)會(huì)被調(diào)用。它會(huì)初始化Move事件處理程序和Timer,并設(shè)置定時(shí)器的間隔為 25 毫秒。記錄原始位置:每當(dāng)窗體的位置發(fā)生變化時(shí),
Move事件處理程序會(huì)記錄窗口的當(dāng)前位置,作為抖動(dòng)前的原始位置。啟動(dòng)抖動(dòng):當(dāng)用戶(hù)點(diǎn)擊按鈕時(shí),
button1_Click事件處理程序會(huì)被觸發(fā)。如果定時(shí)器沒(méi)有啟動(dòng),則啟動(dòng)定時(shí)器,開(kāi)始抖動(dòng)效果。抖動(dòng)過(guò)程:定時(shí)器每 25 毫秒觸發(fā)一次
Tick事件,窗口會(huì)在水平和垂直方向上交替移動(dòng) 2 個(gè)像素,產(chǎn)生抖動(dòng)效果。抖動(dòng)次數(shù)由count_max控制,總共抖動(dòng) 10 次。恢復(fù)原始位置:當(dāng)抖動(dòng)次數(shù)達(dá)到
count_max時(shí),定時(shí)器停止,窗口恢復(fù)到抖動(dòng)前的原始位置。
這兩種方法都是通過(guò)使用 System.Windows.Forms.Timer 和簡(jiǎn)單的數(shù)學(xué)運(yùn)算,輕松實(shí)現(xiàn) WinForms 窗口的抖動(dòng)效果。這個(gè)效果不僅增加了用戶(hù)的互動(dòng)體驗(yàn),還可以用于提醒用戶(hù)注意某些重要的信息或操作。你可以根據(jù)需要進(jìn)一步調(diào)整抖動(dòng)的幅度、速度和次數(shù),以達(dá)到最佳的效果。
以上就是C#實(shí)現(xiàn)winform窗口抖動(dòng)效果的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C# winform窗口抖動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#難點(diǎn)逐個(gè)擊破(1):ref參數(shù)傳遞
一般情況,方法的參數(shù)傳遞是通過(guò)值進(jìn)行傳遞的,另一種情況是引用傳遞,大家可以參考下。2010-02-02
c#中Invoke與BeginInvoke的用法及說(shuō)明
這篇文章主要介紹了c#中Invoke與BeginInvoke的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法
這篇文章主要介紹了C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08
C#實(shí)現(xiàn)將窗體固定在顯示器的左上角且不能移動(dòng)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將窗體固定在顯示器的左上角且不能移動(dòng)的方法,涉及C#窗體固定操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C# Onnx實(shí)現(xiàn)DIS高精度圖像二類(lèi)分割
這篇文章主要為大家詳細(xì)介紹了C# Onnx實(shí)現(xiàn)DIS高精度圖像二類(lèi)分割的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C#基于正則表達(dá)式刪除字符串中數(shù)字或非數(shù)字的方法
這篇文章主要介紹了C#基于正則表達(dá)式刪除字符串中數(shù)字或非數(shù)字的方法,涉及C#針對(duì)數(shù)字的簡(jiǎn)單正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
c#操作sqlserver數(shù)據(jù)庫(kù)的簡(jiǎn)單示例
這篇文章主要介紹了c#操作sqlserver數(shù)據(jù)庫(kù)的簡(jiǎn)單示例,需要的朋友可以參考下2014-04-04

