Winform窗体实现类似停靠在屏幕边缘时自动隐藏的功能

本文介绍了一种使用C#实现的窗体停靠与显示控制方法。通过计时器和事件处理,实现了当鼠标位于窗体上方时,窗体会根据设定的停靠位置完全显示;而当鼠标离开窗体时,窗体则会缩回只露出边缘,便于用户再次选择。此功能适用于工具栏等需要频繁切换显示状态的场景。
该功能主要用到了计时器和Frm_LocationChanged事件。代码如下;
ContractedBlock.gifExpandedBlockStart.gifCode
     private void FrmLocation_Load(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
this.TopMost = true;
            Timer checkDockTimer 
= new Timer();
            checkDockTimer.Tick 
+= new EventHandler(StopRectTimer_Tick);
            checkDockTimer.Interval 
= 100;
            checkDockTimer.Enabled 
= true;
        }



        
private void StopRectTimer_Tick(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
//如果鼠标在窗体上,则根据停靠位置显示整个窗体
            if (this.Bounds.Contains(Cursor.Position))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
switch (this.StopDock)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
case AnchorStyles.Top:
                        
this.Location = new Point(this.Location.X, 0);
                        
break;
                    
case AnchorStyles.Bottom:
                        
this.Location = new Point(this.Location.X, Screen.PrimaryScreen.Bounds.Height - this.Height);
                        
break;
                    
case AnchorStyles.Left:
                        
this.Location = new Point(0this.Location.Y);
                        
break;
                    
case AnchorStyles.Right:
                        
this.Location = new Point(Screen.PrimaryScreen.Bounds.Width - this.Width, this.Location.Y);
                        
break;
                }

            }

            
else  //如果鼠标离开窗体,则根据停靠位置隐藏窗体,但须留出部分窗体边缘以便鼠标选中窗体
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
switch (this.StopDock)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
case AnchorStyles.Top:
                        
this.Location = new Point(this.Location.X, (this.Height - 3* (-1));
                        
break;
                    
case AnchorStyles.Bottom:
                        
this.Location = new Point(this.Location.X, Screen.PrimaryScreen.Bounds.Height - 5);
                        
break;
                    
case AnchorStyles.Left:
                        
this.Location = new Point((-1* (this.Width - 3), this.Location.Y);
                        
break;
                    
case AnchorStyles.Right:
                        
this.Location = new Point(Screen.PrimaryScreen.Bounds.Width - 2this.Location.Y);
                        
break;
                }

            }

        }


ExpandedBlockStart.gifContractedBlock.gif        
/**//// <summary>
        
/// 更改窗体的位置时,根据和各个窗体边缘的距离赋值停靠的位置
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void FrmLocation_LocationChanged(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (this.Top <= 0)                     
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.StopDock = AnchorStyles.Top;
            }

            
else if (this.Bottom >= Screen.PrimaryScreen.Bounds.Height)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.StopDock = AnchorStyles.Bottom;
            }

            
else if (this.Left <= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.StopDock = AnchorStyles.Left;
            }

            
else if (this.Left >= Screen.PrimaryScreen.Bounds.Width - this.Width)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.StopDock = AnchorStyles.Right;
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
this.StopDock = AnchorStyles.None;
            }

        }

转载于:https://www.cnblogs.com/gossip/archive/2009/08/01/1536578.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值