C#:winform窗体 实现类似QQ的窗体在桌面边缘停靠和隐藏
设计思路:
1.使用定时器(Timer)来监控鼠标位置和窗体位置,并实现窗体的停靠和隐藏
2.当鼠标拖动窗体时,窗体才有可能根据自身位置决定是否停靠
3.如果窗体四周没有接触到屏幕边缘则不会停靠
4.如果窗体最小化或最大化了则不存在停靠和隐藏
5.如果鼠标拖动窗体时,如果窗体很接近屏幕边缘则自动将其停靠在该边缘,例如窗体离屏幕顶部小于4个像素则自动将其停靠在顶部
6.窗体可以在桌面的左侧、右侧和顶部停靠和隐藏
7.如果既满足顶部停靠的条件又满足侧面停靠的条件,则规定其向侧面隐藏
8.当鼠标位于窗体内部时,窗体不会隐藏
9.当鼠标位于窗体外部,窗体根据自身的位置决定是否隐藏
10.所谓的隐藏实际上并不是真正的隐藏,而是将整个窗体移出屏幕,仅在屏幕边缘留出一小部分
11.所谓的显示隐藏窗体实际上并不是真正的显示,而是将窗体再次移入屏幕
/// <summary>
/// 时间事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
try
{
timer1.Interval = 200;
AutoSideHideOrShow();
}
catch (Exception ex)
{
LogHelper.WriteLog(GetType(), ex.Message);
}
}
/// <summary>
/// 隐藏功能
/// </summary>
void AutoSideHideOrShow()
{
try
{
int sideThickness = 4;//边缘的厚度,窗体停靠在边缘隐藏后留出来的可见部分的厚度
//如果窗体最小化或最大化了则什么也不做
if (this.WindowState == FormWindowState.Minimized || this.WindowState == FormWindowState.Maximized)
{
return;
}
//如果鼠标在窗体内
if (Cursor.Position.X >= this.Left && Cursor.Position.X < this.Right && Cursor.Position.Y >= this.Top && Cursor.Position.Y < this.Bottom)
{
//如果窗体离屏幕边缘很近,则自动停靠在该边缘
if (this.Top <= sideThickness)
{
this.Top = 0;
}
if (this.Left <= sideThickness)
{
this.Left = 0;
}
if (this.Left >= Screen.PrimaryScreen.WorkingArea.Width - this.Width - sideThickness)
{
this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
}
}
//当鼠标离开窗体以后
else
{
//隐藏到屏幕左边缘
if (this.Left == 0)
{
this.Left = sideThickness - this.Width;
LogHelper.WriteLog(GetType(), "AutoSideHideOrShow隐藏到屏幕左边缘");
}
//隐藏到屏幕右边缘
else if (this.Left == Screen.PrimaryScreen.WorkingArea.Width - this.Width)
{
this.Left = Screen.PrimaryScreen.WorkingArea.Width - sideThickness;
LogHelper.WriteLog(GetType(), "AutoSideHideOrShow隐藏到屏幕右边缘");
}
//隐藏到屏幕上边缘
else if (this.Top == 0 && this.Left > 0 && this.Left < Screen.PrimaryScreen.WorkingArea.Width - this.Width)
{
this.Top = sideThickness - this.Height;
LogHelper.WriteLog(GetType(), "AutoSideHideOrShow隐藏到屏幕上边缘");
}
}
}
catch (Exception ex)
{
LogHelper.WriteLog(GetType(), "AutoSideHideOrShow" + ex.Message);
}
}
#region 点击右上角X按钮关闭事件
protected override void WndProc(ref Message msg)
{
try
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
// 点击winform右上关闭按钮
if (msg.Msg == WM_SYSCOMMAND && ((int)msg.WParam == SC_CLOSE))
{
webBrowser1.ExecuteJavascript("jslog()");//调用前端js方法
this.Close();
LogHelper.WriteLog(GetType(), "WndProc关闭窗体");
return;
}
base.WndProc(ref msg);
}
catch (Exception ex)
{
LogHelper.WriteLog(GetType(), "WndProc" + ex.Message);
}
}
#endregion
代码:
C#:winform窗体 实现类似QQ的窗体在桌面边缘停靠和隐藏的更多相关文章
- 转 实现类似QQ的窗体停靠
[DllImport("User32.dll")] public static extern bool PtInRect(ref Rectangle Rects, Point lp ...
- C#利用API制作类似QQ一样的右下角弹出窗体
C#利用API制作类似QQ一样的右下角弹出窗体 (2009-03-21 15:02:49) 转载▼ 标签: 杂谈 分类: .NET using System;using System.Collecti ...
- 用C#代码实现类似QQ窗体的“上、左、右”停靠功能
大家都知道QQ有一个自动停靠功能,即“上.左.右”,当你把窗体拖到屏幕边缘,然后移开鼠标它会自动缩放,然后只显示一小小点出来,我们仔细观察会发现其实它只露3像素左右的边缘,当你鼠标移上去它又会伸出来, ...
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...
- .net winForm 实现类似qq 弹出新闻
.net winForm 实现类似qq 弹出新闻 一.背景: echong 之前一直用 公司大牛c语言写的一个弹出托管,前几天写东西的时候发现com调用不是那么好使.而手头上写的这个东西又是.ne ...
- C# WinForm 慎用 override CreateParams 来重载窗体的一些特性
窗体和控件的属性CreateParams(这真的是一个属性)很神奇,因为通过它你能够很方便的控制窗体或控件诸如边框.最大化最小化关闭按钮的隐藏.窗体的模式化弹窗模式等的一些特性.虽然,CreatePa ...
- winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体
winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...
- C# WinForm 单例模式(例:同一个窗体只创建一次实例)
//C# WinForm 单例模式(例:同一个窗体只创建一次实例) //打开窗体的事件: Form3 f = Form3.InstanceObject() ; //实例化窗体 f.Focus(); / ...
- c# winform 在一个窗体中使用另一个窗体中TextBox控件的值——解决办法
[前提]一个winform应用程序项目中,窗体B,需要使用 窗体A 中一个TextBox控件的值,进行计算等操作. [解决方案] 1.在窗体A中定义:public static double a;// ...
随机推荐
- 记一次 .NET 某新能源系统 线程疯涨 分析
一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决. 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDbg. 二: WinD ...
- Host–Parasite(主从关系): Graph LSTM-in-LSTM for Group Activity Recognition
This article aims to tackle the problem of group activity recognition in the multiple-person scene. ...
- JDK的下载与安装和环境变量的配置
一.jdk下载打开浏览器在地址栏输入: http://www.oracle.com ,进入Oracle官网主页面,选择 Products-----Java---->Download Java . ...
- P4289 【一本通提高篇广搜的优化技巧】[HAOI2008]移动玩具
[HAOI2008]移动玩具 题目描述 在一个 4 × 4 4\times4 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方 ...
- [Linux] 如何在 Linux 电脑上制作专业的视频教程
目录 前言 1.软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2.视频教程制作 3.效果 参考链接 前言 博主使用 Arch Linux ...
- React报错之Object is possibly null
正文从这开始~ 类型守卫 使用类型守卫来解决React中useRef钩子"Object is possibly null"的错误.比如说,if (inputRef.current) ...
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
借助路由系统提供的请求URL模式与对应终结点之间的映射关系,我们可以将具有相同URL模式的请求分发给与之匹配的终结点进行处理.ASP.NET的路由是通过EndpointRoutingMiddlewar ...
- 11. MGR技术架构及数据同步、认证机制 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 1. MGR架构 2. 事务数据同步.认证过程 ...
- 万答#6,MySQL最多只能用到128个逻辑CPU,是真的吗
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 江湖传言MySQL最多只能用到128个逻辑CPU,是真的吗? 同事从客户现场回来,委屈巴巴的说,某PG服务商告诉客户&qu ...
- Luogu5019 铺设道路 (贪心)
水题,水得好无语 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...