C# 實現視窗程式winform像QQ一樣靠近桌面邊緣自動隱藏視窗
阿新 • • 發佈:2018-12-20
實現原理:
實現這個功能的原理步驟如下:
1、判斷窗體程式是否靠近桌面邊緣;
2、獲取桌面螢幕大小與窗體程式大小;
3、把窗體程式顯示在桌面以外隱藏起來,預留部分窗體方便使用者拉出程式;
4、判斷滑鼠是否在窗體程式上,在就靠邊顯示整個窗體程式,不在就隱藏顯示,並調為半透明轉態。
程式部分:
int SH; int SW; int self_SH; int self_SW; int star_win_flag = 1;//視窗初始化位置標誌位,防止隱藏視窗後定時器重新跑視窗函式再次在初始化位置開啟private void Form1_Load(object sender, EventArgs e) { //獲取顯示器螢幕的大小,不包括工作列、停靠視窗 SH = Screen.PrimaryScreen.WorkingArea.Height; SW = Screen.PrimaryScreen.WorkingArea.Width; //獲取當前活動視窗高度跟寬度 self_SH = this.Size.Height; self_SW= this.Size.Width; if(star_win_flag==1) { //設定視窗開啟的位置為下方居中 SetDesktopLocation((SW - self_SW) / 2, SH - self_SH); star_win_flag = 0; } //============新增窗體所在位置定時檢測================= TopMost = true; System.Windows.Forms.Timer MyTimer= new System.Windows.Forms.Timer(); MyTimer.Tick += new EventHandler(StopRectTimer_Tick); MyTimer.Interval = 100; MyTimer.Enabled = true; }
//=================隱藏窗體&顯示部分================== int check_flag = 0; //窗體隱藏標誌位,0為不開啟隱藏功能,初始預設0 int win = 0; int frmX; int frmY; private void StopRectTimer_Tick(object sender, EventArgs e) { // 獲取窗體位置 frmX = this.Location.X; frmY = this.Location.Y; if (check_flag == 1) { //獲取視窗的邊沿與桌面的間距,判斷視窗是否靠近邊沿裡面-1個位置 if (this.Left <= 0) //獲取控制元件左邊沿與桌面左邊沿的間距,視窗靠近左邊桌面邊沿 win = 1; else if (this.Top <= 0 && this.Left > 0 && this.Right < SW - 1)////獲取控制元件上邊沿與桌面上邊沿的間距,視窗靠近頂端桌面邊沿 win = 2; else if (this.Right >= SW) ////獲取控制元件右邊沿與桌面左邊沿的間距,視窗靠近右邊桌面邊沿 win = 3; else //窗體沒有靠近邊沿 win = 0; /* Cursor.Position獲取當前滑鼠的位置 * Bounds.Contains(Cursor.Position)獲取滑鼠位置是否在視窗邊界裡面,在返回ture *如果滑鼠在窗體上,則根據停靠位置顯示整個窗體 *窗體邊沿計算是以左邊沿為主*/ if (Bounds.Contains(Cursor.Position)) { switch (win) { case 1: this.Opacity = 1.0f; //視窗恢復不透明狀態 //窗體靠近左沿時,滑鼠在窗體顯示完整窗體 SetDesktopLocation(0, frmY); break; case 2: this.Opacity = 1.0f; //視窗恢復不透明狀態 //窗體靠近頂部時,滑鼠在窗體顯示完整窗體 SetDesktopLocation(frmX, 0); break; case 3: this.Opacity = 1.0f; //視窗恢復不透明狀態 //窗體靠近右沿時,滑鼠在窗體顯示完整窗體 SetDesktopLocation(SW - self_SW, frmY); break; } } //如果滑鼠離開窗體,則根據停靠位置隱藏窗體(即把窗體顯示出桌面以外),但須留出部分窗體邊緣以便滑鼠選中窗體,這裡留7個位置 else { switch (win) { case 1: this.Opacity = 0.2f; //視窗百分之80透明 //窗體靠近左沿時,滑鼠不在窗體時隱藏 SetDesktopLocation(20 - self_SW, frmY); break; case 2: this.Opacity = 0.2f; //窗體靠近頂部時,滑鼠不在窗體時隱藏 SetDesktopLocation(frmX, 20 - self_SH); break; case 3: this.Opacity = 0.2f; //窗體靠近右沿時,滑鼠不在窗體時隱藏 SetDesktopLocation(SW - 20, frmY); break; } } } }
/*==========窗體邊沿隱藏功能開啟選擇框===========*/ private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.CheckState == CheckState.Checked) //判斷複選框選中 { check_flag = 1; //if(win==0)//判斷框功能選中時,判斷視窗不在邊沿時自動收到上邊沿中間隱藏 { this.Opacity = 0.2f; //視窗半透明 SetDesktopLocation((SW - self_SW) / 2, 20-SH ); } //MessageBox.Show("checkbox1 is checked\n" + checkBox1.Text); } else if (checkBox1.CheckState == CheckState.Unchecked) //判斷複選框沒選中 { check_flag = 0; //MessageBox.Show("checkbox1 is Unchecked\n" + checkBox1.Text); } }
隱藏結果: