C# 滑鼠接近視窗邊緣時自動彈窗
阿新 • • 發佈:2018-12-16
原理
定時器定時輪詢,讀取滑鼠當前位置,並與窗體邊框位置比較,在附近的話就將子窗體的屬性修改為show,否則修改為hide.這個子窗體要在主窗體建立的時候就建立,不能每次滑鼠接近時臨時建這樣頻繁建會導致系統性能變差,所以子視窗物件在本名稱空間中應該是全域性的。
子窗體類
要彈窗的介面風格就在此類中自定義
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace EzHostCtrl { public partial class AlarmInfoWindow : Form { public AlarmInfoWindow() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; //允許跨執行緒操作此視窗 } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void clearnAlarm_Button_Click(object sender, EventArgs e) { MessageBox.Show("報警已清除"); } /* 自己新增的,用於向listBOX中新增項 */ public void listBox1_addItem(String str) { this.AlarmList_listBox.Items.Add(str); } } }
定時器的建立
這個定時器的屬性可能會在多個方法中使用,而且定時器作為輪詢工具生存週期始終伴隨整個上位機執行期間,所以,也定義成全域性的,並且在主窗體的建構函式中就建立。
public Form_EzHostCtrl() { InitializeComponent(); creatTimerforAlarmShow();//定時器要隨物件一起建立 } public void Initial() { LoadPath(); LayoutInitial(); } private System.Timers.Timer AlarmWindShowTimer = new System.Timers.Timer(); private void creatTimerforAlarmShow() { AlarmWindShowTimer.Interval = 50; AlarmWindShowTimer.Elapsed += AlarmWindShowTimer_Elapsed; //定時時間到的時候的回撥函式 AlarmWindShowTimer.AutoReset = true;//需要反覆檢測滑鼠 AlarmWindShowTimer.Enabled = true; //啟動定時器 }
獲取滑鼠位置
- 包含庫:
using System.Drawing;
- 讀位置:
Cursor.Position.X
父窗體中對子窗體的操作
1.建立一全域性的子窗體物件; 2.根據條件改變他的顯示/隱藏屬性。
private AlarmInfoWindow AlarmWind = new AlarmInfoWindow(); //為避免頻繁建立,定義成全域性的 private int flg_AlarmWind_is_show=0; /* 定時器回撥函式 */ private void AlarmWindShowTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //如果滑鼠在窗體邊緣附近 if ((Cursor.Position.X - this.Left < 50 && Cursor.Position.X - this.Left > -50) || (Cursor.Position.X - this.Right < 50 && Cursor.Position.X - this.Right > -50) || (Cursor.Position.Y - this.Top < 50 && Cursor.Position.Y - this.Top > -50) || (Cursor.Position.Y - this.Bottom < 50 && Cursor.Position.Y - this.Bottom > -50)) { if (flg_AlarmWind_is_show == 0) { AlarmWind.Show(); } flg_AlarmWind_is_show = 1; } else { AlarmWind.Hide(); flg_AlarmWind_is_show = 0; } }