• 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;
            }
    

      

  • 相关阅读:
    我的java学习之路--Reflect专题
    jQuery——动态给表格添加序号
    jQuery操作表格(table)的常用方法、技巧汇总
    Jquery如何删除table里面checkbox选中的多个行
    Mybatis问题:There is no getter for property named 'unitId' in 'class java.lang.String'
    jquery 遍历表格,需要表格中每个td的内容
    用jquery怎么删除<table>的一行
    xml报错 Parse Fatal Error :在实体引用中,实体名称必须紧跟在'&'后面
    mybatis做like模糊查询
    javascript eval和JSON之间的联系
  • 原文地址:https://www.cnblogs.com/haiyabtx/p/2697202.html
Copyright © 2020-2023  润新知