当前位置: 首页 > 科技观察

简单三步实现QQ表格并排隐藏GG4.2最新源码

时间:2023-03-21 13:09:10 科技观察

QQ有一个侧隐藏功能,使用起来非常方便:在屏幕上拖动QQ主窗体,当上边沿当窗体的上边缘对齐时,主窗口会duang~~隐藏,当鼠标移动到屏幕上边缘的相应区域时,会显示主窗口又duang~~。我在GG最新的4.2版本也加入了侧边隐藏的功能,支持左边隐藏、上边隐藏、右边隐藏三种模式,实现侧边隐藏为一个可重复使用的组件AutoDocker。那么,侧边隐藏的功能是如何实现的呢?(在最初实现的过程中,遇到了很多问题,也花了很多时间,现在直接分享结果)1.侧边隐藏的原理侧边隐藏的本质其实不是设置Visiable而是窗体的为false,整个窗体的位置被移到屏幕区域之外。例如隐藏右边缘,实际效果图如下:方案说明如下:(1)拖动窗体在屏幕上移动时,查看窗体的位置是否到达屏幕的边界,如果已经到了边界,那就准备靠边躲。(2)当达到隐藏条件,鼠标离开主窗体时,实现隐藏。(3)窗体隐藏后,当鼠标光标移动到窗体与屏幕相交的边界位置时,窗体将正常显示;之后:当鼠标再次离开窗体区域时,窗体将再次隐藏。b.如果鼠标拖动窗体改变位置,使其不再满足隐藏条件,那么窗体将一直正常显示。#p#2。具体实现过程1.基本元素的定义首先,我们需要定义隐藏边的类型:left、top、right。使用DockHideType枚举来指示:///

///侧隐藏的类型。///publicenumDockHideType{//////不隐藏///None=0,//////隐藏在上边缘///Top,//////隐藏在左边缘///Left,//////隐藏在右边缘///Right}其次,根据上面的原理描述,我们知道窗体有三种状态:正常显示、准备隐藏、隐藏。这三种状态用FormDockHideStatus枚举表示://////窗体的显示或隐藏状态///publicenumFormDockHideStatus{//////Hidden///Hide=0,//////准备隐藏///ReadyToHide,//////正常显示///ShowNormally}2.判断是否满足隐藏条件是显而易见的,每次窗体位置变化时我们都应该做这样的判断,所以这个判断应该在窗体的LocationChanged事件中调用。privatevoiddockedForm_LocationChanged(objectsender,EventArgse){this.ComputeDockHideType();if(!this.IsOrg){this.lastBoard=this.dockedForm.Bounds;this.IsOrg=true;}}//////判断是否达到隐藏条件?以及什么类型的隐藏。///privatevoidComputeDockHideType(){if(this.dockedForm.Top<=0){this.dockHideType=DockHideType.Top;if(this.dockedForm.Bounds.Contains(Cursor.Position)){this.formDockHideStatus=FormDockHideStatus.ReadyToHide;return;}this.formDockHideStatus=FormDockHideStatus.Hide;return;}else{if(this.dockedForm.Left<=0){this.dockHideType=DockHideType.Left;if(this.dockedForm.Bounds.Contains(Cursor.Position)){this.formDockHideStatus=FormDockHideStatus.ReadyToHide;return;}this.formDockHideStatus=FormDockHideStaus.Hide;return;}else{if(this.dockedForm.Left///定时器周期判断。///privatevoidCheckPosTimer_Tick(objectsender,EventArgse){//当鼠标移动到窗体的范围内时(此时窗体的位置在屏幕外)if(this.dockedForm.Bounds.Contains(光标.位置)){if(this.dockHideType!=DockHideType.Top){if(this.dockHideType!=DockHideType.Left){if(this.dockHideType!=DockHideType.Right){return;}if(this.formDockHideStatus==FormDockHideStatus.Hide){this.dockedForm.Location=newPoint(Screen.PrimaryScreen.Bounds.Width-this.dockedForm.Width,this.dockedForm.Location.Y);return;}}else{if(this.formDockHideStatus==FormDockHideStatus.Hide){this.dockedForm.Location=newPoint(0,this.dockedForm.Location.Y);return;}}}else{if(this.formDockHideStatus==FormDockHideStatus.Hide){this.dockedForm.Location=newPoint(this.dockedForm.Location.X,0);return;}}}else//当鼠标在窗体范围之外时,根据DockHideType的值确定窗体的位置。{switch(this.dockHideType){caseDockHideType.None:{if(this.IsOrg&&this.formDockHideStatus==FormDockHideStatus.ShowNormally&&(this.dockedForm.Bounds.Width!=this.lastBoard.Width||this.dockedForm.Bounds.Height!=this.lastBoard.Height)){this.dockedForm.Size=newSize(this.lastBoard.Width,this.lastBoard.Height);}break;}caseDockHideType.Top:{this.dockedForm.Location=newPoint(this.dockedForm.Location.X,(this.dockedForm.Height-4)*-1);return;}caseDockHideType.Left:{this.dockedForm.Location=newPoint(-1*(this.dockedForm.Width-4),this.dockedForm.Location.Y);return;}default:{if(anchorStyles2!=DockHideType.Right){return;}this.dockedForm.Location=newPoint(Screen.PrimaryScreen.Bounds.Width-4,this.dockedForm.Location.Y);return;}}}}(1)当窗体隐藏时,准确的说,当窗体在屏幕区域之外时,将鼠标光标移动到窗体上(实际上是窗体的Boundary),修改Location窗体才能正常显示。(2)当从隐藏(1)中描述的窗体切换到正常显示时,代码控制窗体的位置,使其边界刚好与屏幕边界对齐。这样做的目的是,当鼠标离开窗口时,body的范围发生变化时,窗体可以再次隐藏。(3)定时器的周期检测结合鼠标拖动窗口的事件处理,完全实现了类似QQ的左右隐藏效果。而且我们比QQ强,QQ只实现顶层隐藏。#p#3。如何使用AutoDocker组件AutoDocker是以组件(Component)的形式实现的。编译完成后,工具箱中会出现一个AutoDocker组件。它的使用非常简单:将AutoDocker从工具箱中拖放到主窗体MainForm中,然后在主窗体的构造函数中添加一行代码:this.autoDocker1.Initialize(this);这样主窗体运行后,就有了自动拉到一边隐藏的功能,是不是很duang~~~在GG4.2的源码中,找到客户端工程(GG2014)下的AutoDocker.cs文件),可以详细研究拉开和隐藏的实现细节。4、GGV4.2源码(点击下载)GG是QQ的高仿版本,可以在广域网部署运行。V1.0版本于2013年8月7日发布,最新版本为4.2。更详细的GG介绍可以查看可部署运行于广域网的QQ高仿版——GG2013总结。如果觉得我的工作对你有帮助,请点赞关注我,duang~~~