C#.WinForm下懸掛視窗的簡易實現

來源:互聯網
上載者:User

前兩天在工作中用C#實現了一個WinForm下的懸掛視窗;
之前在網上搜尋了幾下,沒有發現類似的說明,特在此記錄一下。
特別說明:所謂懸掛視窗,就是類似QQ聊天工具的一個功能,當視窗放到案頭的上邊界時自動收縮成一個小條隱藏起來;而一旦滑鼠再次接觸到上述邊界的時候,視窗又會自動延伸。

實現方法有兩類,一是視窗內實現懸掛,在視窗內建立一個小的Panel,正常時不可見,在懸掛是顯示,
懸掛時設定視窗標題列不顯示和視窗高度為該Panel高度;二是單獨視窗懸掛,建立新的視窗作為懸掛時的顯示條,同時隱藏掉主視窗。

一、視窗內實現懸掛
在LocationChanged事件內判斷是否到案頭上邊界,通過定時器判斷當前滑鼠位置
(System.Windows.Forms.Control.MousePosition)是否離開視窗地區,或者進入視窗地區。

  實現代碼。

二、單獨視窗懸掛

本來不想考慮第二種方式的,但是後來發現需要懸掛的視窗設定高度居然無效,是一個從DevComponents.DotNetBar.Office2007RibbonForm繼承的視窗類別。

 實現思路基本一樣,只是需要注意的是判斷當前滑鼠的位置需要分不同的視窗轉換座標,還有其他細節見代碼。

定義變數:

        bool m_bXuanGua = false; //表單是否處在懸掛狀態
        HideFlagForm m_HideFlagForm = new HideFlagForm();  //懸掛標誌視窗

主要方法:

        /// <summary>
        /// 視窗位置被拖動的響應事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_LocationChanged(object sender, EventArgs e)
        {
            if (Location.Y < 0)
            {
                Top = 0;
                m_bXuanGua = true;
            }
            else
            {
                m_bXuanGua = false;
                plHideForm.Visible = false;
            }
            SetHideFlagFormPos();
        }
        /// <summary>
        /// 設定標誌表單的位置和大小
        /// </summary>
        private void SetHideFlagFormPos()
        {
            m_HideFlagForm.Left = this.Left;
            m_HideFlagForm.Top = this.Top;
            m_HideFlagForm.Width = this.Width;
            m_HideFlagForm.Height = 10;
        }

        /// <summary>
        /// 懸掛或者展開表單
        /// </summary>
        private void ShowHideForm()
        {
            Point pt = new Point(System.Windows.Forms.Control.MousePosition.X,
                System.Windows.Forms.Control.MousePosition.Y);
            Point pt2 = new Point();

            if (this.Visible)
                pt2 = PointToClient(pt);
            else
                pt2 = m_HideFlagForm.PointToClient(pt);

            int iHight = 0;
            if (this.Visible)
                iHight = Height;
            else
                iHight = m_HideFlagForm.Height;

            if (pt2.X < 0 || pt2.X > Width || pt2.Y > iHight)  //在表單用戶端區域之外時
            {
                if (m_bXuanGua && FormBorderStyle != FormBorderStyle.None)
                {
                    FormBorderStyle = FormBorderStyle.None;

                    SetHideFlagFormPos();

                    this.Hide();
                    m_HideFlagForm.Show();
                    SetHideFlagFormPos();
                }
            }
            else //在表單用戶端區域之內
            {
                if (m_bXuanGua && FormBorderStyle != FormBorderStyle.Sizable)
                {
                    FormBorderStyle = FormBorderStyle.Sizable;

                    m_HideFlagForm.Hide();
                    this.Show();
                }
            }
        }

        /// <summary>
        /// 定時器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tmCursorPosCalc_Tick(object sender, EventArgs e)
        {
            if (System.Windows.Forms.Control.MouseButtons == MouseButtons.Left)
                return;  //在滑鼠左鍵為按下時,認為視窗處在拖動狀態,暫停滑鼠位置的判斷
            ShowHideForm();
        }

        /// <summary>
        /// 視窗大小改變事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Resize(object sender, EventArgs e)
        {
            m_HideFlagForm.Left = Left;
            m_HideFlagForm.Width = Width;
        }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.