用C#代码实现类似QQ窗体的“上、左、右”停靠功能

阅读对象:入门级,老鸟漂过

大家都知道QQ有一个自动停靠功能,即“上、左、右”,当你把窗体拖到屏幕边缘,然后移开鼠标它会自动缩放,然后只显示一小小点出来,我们仔细观察会发现其实它只露3像素左右的边缘,当你鼠标移上去它又会伸出来,介于普通入门级学者要求艾伟就在这里给需要的朋友们分享分享我是怎么实现的,代码很少,效果如下:

先在当前类里弄几个变量,方便逻辑判断:

QQ_MODE(用于记录窗体当前的停靠状态,即0为不停靠,1为X轴,2为Y轴,3为顶部),QQ_T(窗体缩放时显示出来的边缘大小),QQ_XY(鼠标坐标与窗体边缘多少像素时为可见区)

 

逻辑思考:如果鼠标左键在当前窗体按下时,无论窗体位置在哪,那么此窗体一定是显示的,并且可能为拖动状态,即不停靠;如果鼠标移到到窗口内或到移动到边缘差为QQ_XY内区域时窗体可见;当鼠标离开窗体时则判断是否满足伸缩的条件,即“上、左、右”,其中“上”为优先级;

再拖入窗体一个“timer”控件,关键的逻辑判断代码如下: 

#region 类似QQ的收缩功能,逻辑实现代码

int QQ_MODE = 0, QQ_T = 3, QQ_XY = 6;//0为不停靠,1为X轴,2为Y轴,3为顶部;QQ_T为显示的像素;QQ_XY为误差        private void timer1_Tick(object sender, EventArgs e)        {//如果左键按下就不处理当前逻辑[是否收缩]            if (MouseButtons == MouseButtons.Left)return;

//鼠标的位置            int x = MousePosition.X, y = MousePosition.Y;

//鼠标移动到窗口内,显示            if (x > (this.Location.X - QQ_XY)                &&                x < (this.Location.X + this.Width + QQ_XY)                &&                y > (this.Location.Y - QQ_XY)                &&                 y < (this.Location.Y + this.Height + QQ_XY))            {if (this.QQ_MODE == 1)this.Location = new Point(QQ_T, this.Location.Y);else if (this.QQ_MODE == 2)this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width - QQ_T, this.Location.Y);else if (this.QQ_MODE == 3)this.Location = new Point(this.Location.X, QQ_T);            }else//鼠标移动到窗口外,隐藏            {if (this.Location.Y <= QQ_T)//上                {this.Location = new Point(this.Location.X, QQ_T - this.Height);this.QQ_MODE = 3;                }else if (this.Location.X <= QQ_T)//左                {this.Location = new Point(QQ_T - this.Width, this.Location.Y);this.QQ_MODE = 1;                }else if (this.Location.X >= Screen.PrimaryScreen.WorkingArea.Width - this.Width - QQ_T)//右                {this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - QQ_T, this.Location.Y);this.QQ_MODE = 2;                }elsethis.QQ_MODE = 0;            }        }

//移动窗体时,解决QQ逻辑        private void ToolsMenu_Move(object sender, EventArgs e)        {this.QQ_MODE = 0;        }

#endregion

 

 

 

 

时间: 2024-08-22 14:59:19

用C#代码实现类似QQ窗体的“上、左、右”停靠功能的相关文章

用C#开发类似QQ输入法的不规则窗体的程序详解+代码打包分享

QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的...等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能. 先来看看实现效果(左边的字体也是窗体的一部分): 其实其核心就是围绕Drawing2D来实现的,用GraphicsPath的方法GetPixel取左上角的一点的颜色作为我们透明色,然后横坚循环遍历每一个像素坐标点,如果发现其为透明色,则不加入绘制窗体区域. 下面看怎么实现的

qq-如何纯java实现类似QQ聊天时候的气泡功能,最好有代码。请给位大神指教

问题描述 如何纯java实现类似QQ聊天时候的气泡功能,最好有代码.请给位大神指教 如何纯java实现类似QQ聊天时候的气泡功能,请给位大神指教一下 解决方案 最近在用Java做一个类似QQ聊天系统 原理:就是给你每次发的消息加一个背景面板panel,每次发送消息,都加载一次,不过这样在聊天框显示比较慢, 暂时我没找到好方法

数据库- 各位大神好,我要做一个类似QQ空间访问量的功能,请问各位大神,后台代码怎样写才是最高效的

问题描述 各位大神好,我要做一个类似QQ空间访问量的功能,请问各位大神,后台代码怎样写才是最高效的 各位大神好,我要做一个类似QQ空间访问量的功能,请问各位大神,后台代码怎样写才是最高效的,不能随时更新数据库,这样访问量大的话会造成很大负担,想问问现在普遍的做法,或者比较好的方法有哪些,谢谢各位了 解决方案 先学会"走",再考虑"跑".也许你想一下子就有一个"最高效"的设计.其实不是,没有放之四海而皆准的设计,你从简单,一般的设计到优化的,特殊的

如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码

问题描述 如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码 请问如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码 解决方案 http://etwo.iteye.com/blog/1460375

Winform窗体类似QQ差不多的样式

问题描述 在创建Winform窗体应用程序的时候,希望实现像QQ窗体那种半透明窗体,看起来很柔滑的感觉.不要隐藏边框,让整个窗体融为一体的那种感觉,好像是继承什么API函数,忘记了,求高手! 解决方案 解决方案二:网上解决方案好像挺多的啊,google搜一下,参考http://826891.blog.163.com/blog/static/8637693201132061446148/解决方案三:这个是设置窗口的属性..Opacity这个属性.这个属性是一个百分比哈.解决方案四:去我的资源里面下

C#实现类似qq的屏幕截图程序

程序 因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个小DEMO.程序很简单,用到的技术也不多,只能实现类似qq的截图功能(方法虽然很笨)程序流程如下: 1.截取整个屏幕并保存2.新开一个全屏窗口,将保存的屏幕作为背景3.鼠标拖动改变截取范围,右键取消4.双击截取,保存在粘贴板,全屏窗口关闭 好了,下面的是代码部分 首先新建一个项目ScreenCutter(VS2005),将窗体名改为MainForm,再新建一个窗体ScreenBody.添加一个按

WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右下角会显示一个窗体,一般情况下该窗体会隐藏停靠在右边,只露出很小部分,当鼠标移动到这个很小部分时,窗体全部显示,显示过程是从右边滑动到左边,当鼠标离开窗体时,窗体需要隐藏在右边,只露出很小部分,隐藏过程是从左边滑动到右边. 实现此类效果我碰到的连个难点是:1.如何判断鼠标离开了窗体?2.窗体显示隐藏

C#实现类似qq的屏幕截图程序_C#教程

因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个小DEMO.程序很简单,用到的技术也不多,只能实现类似qq的截图功能(方法虽然很笨)程序流程如下: 1.截取整个屏幕并保存2.新开一个全屏窗口,将保存的屏幕作为背景3.鼠标拖动改变截取范围,右键取消4.双击截取,保存在粘贴板,全屏窗口关闭 好了,下面的是代码部分 首先新建一个项目ScreenCutter(VS2005),将窗体名改为MainForm,再新建一个窗体ScreenBody.添加一个按钮bt

类似QQ游戏大厅导航的树型控件

在最近的项目中,需要实现一个类似QQ游戏大厅导航树型控件.参考了网络上的部分资料,自己动手制作了一个类CTreeCtrlBT.其界面如下: 实现步骤 第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面之上.添加一个新类CTreeCtrlBT派生自CTreeCtrl. 第二步:为该类添加一些消息响应以及虚函数.其详细作用如下: void PreSubclassWindow(); //用于添加初始化控件的相关信息 WM_SIZE //控件区域发生变化时候的处理 WM_PAINT /