C# 实现类似QQ的窗体在桌面边缘停靠和隐藏

本文介绍了一个窗体自动停靠和隐藏的设计方案,通过定时器监控鼠标位置及窗体位置,实现窗体在屏幕边缘的自动停靠与隐藏功能。详细描述了窗体在不同条件下如何进行停靠和隐藏的行为逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计思路:

1.使用定时器(Timer)来监控鼠标位置和窗体位置,并实现窗体的停靠和隐藏
2.当鼠标拖动窗体时,窗体才有可能根据自身位置决定是否停靠
3.如果窗体四周没有接触到屏幕边缘则不会停靠
4.如果窗体最小化或最大化了则不存在停靠和隐藏
5.如果鼠标拖动窗体时,如果窗体很接近屏幕边缘则自动将其停靠在该边缘,例如窗体离屏幕顶部小于4个像素则自动将其停靠在顶部
6.窗体可以在桌面的左侧、右侧和顶部停靠和隐藏
7.如果既满足顶部停靠的条件又满足侧面停靠的条件,则规定其向侧面隐藏
8.当鼠标位于窗体内部时,窗体不会隐藏
9.当鼠标位于窗体外部,窗体根据自身的位置决定是否隐藏
10.所谓的隐藏实际上并不是真正的隐藏,而是将整个窗体移出屏幕,仅在屏幕边缘留出一小部分
11.所谓的显示隐藏窗体实际上并不是真正的显示,而是将窗体再次移入屏幕
12.(存在的问题)默认情况下当用户点击“显示桌面”,会使我们隐藏的窗体被最小化。显然这并不是我们想要的结果,该问题暂时保留

效果显示:


代码:

[csharp]  view plain  copy
  1. private void timer1_Tick(object sender, EventArgs e)  
  2.        {  
  3.            timer1.Interval = 200;  
  4.            AutoSideHideOrShow();  
  5.        }  
  6.   
  7.        void AutoSideHideOrShow()  
  8.        {  
  9.            int sideThickness = 4;//边缘的厚度,窗体停靠在边缘隐藏后留出来的可见部分的厚度  
  10.   
  11.            //如果窗体最小化或最大化了则什么也不做  
  12.            if (this.WindowState == FormWindowState.Minimized || this.WindowState == FormWindowState.Maximized)  
  13.            {  
  14.                return;  
  15.            }  
  16.   
  17.            //如果鼠标在窗体内  
  18.            if (Cursor.Position.X >= this.Left && Cursor.Position.X < this.Right && Cursor.Position.Y >= this.Top && Cursor.Position.Y < this.Bottom)  
  19.            {  
  20.                //如果窗体离屏幕边缘很近,则自动停靠在该边缘  
  21.                if (this.Top <= sideThickness)  
  22.                {  
  23.                    this.Top = 0;  
  24.                }  
  25.                if (this.Left <= sideThickness)  
  26.                {  
  27.                    this.Left = 0;  
  28.                }  
  29.                if (this.Left >= Screen.PrimaryScreen.WorkingArea.Width - this.Width - sideThickness)  
  30.                {  
  31.                    this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;  
  32.                }  
  33.            }  
  34.            //当鼠标离开窗体以后  
  35.            else  
  36.            {  
  37.                //隐藏到屏幕左边缘  
  38.                if (this.Left == 0)  
  39.                {  
  40.                    this.Left = sideThickness - this.Width;  
  41.                }  
  42.                //隐藏到屏幕右边缘  
  43.                else if (this.Left == Screen.PrimaryScreen.WorkingArea.Width - this.Width)  
  44.                {  
  45.                    this.Left = Screen.PrimaryScreen.WorkingArea.Width - sideThickness;  
  46.                }  
  47.                //隐藏到屏幕上边缘  
  48.                else if (this.Top == 0 && this.Left > 0 && this.Left < Screen.PrimaryScreen.WorkingArea.Width - this.Width)  
  49.                {  
  50.                    this.Top = sideThickness - this.Height;   
  51.                }  
  52.            }  
  53.        }  

from: https://blog.youkuaiyun.com/dufangfeilong/article/details/41750287




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值