C#.WinForm下悬挂窗口的简易实现

C#.WinForm下悬挂窗口的简易实现 

前两天在工作中用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;

        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值