1. 程式人生 > >C# 滑鼠接近視窗邊緣時自動彈窗

C# 滑鼠接近視窗邊緣時自動彈窗

原理

定時器定時輪詢,讀取滑鼠當前位置,並與窗體邊框位置比較,在附近的話就將子窗體的屬性修改為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;  //啟動定時器

        }

獲取滑鼠位置

  1. 包含庫:
using System.Drawing;
  1. 讀位置:
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;
            }
        }