1. 程式人生 > >C# 實現視窗程式winform像QQ一樣靠近桌面邊緣自動隱藏視窗

C# 實現視窗程式winform像QQ一樣靠近桌面邊緣自動隱藏視窗

實現原理:

  實現這個功能的原理步驟如下:

    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);

            }
        }

 

隱藏結果: