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;// ...
随机推荐
- Linux for CentOS 下的 nginx 绿色安装-超省心安装
1.我这里是nginx-1.13.0-1.x86_64 .rpm(点击下载)版本的. 2.安装nginx的相应环境.有些环境可能不必须,但是安装了,确保以防万一,多多益善 yum install gd ...
- 关于'utf-8' codec can't decode byte 0xb9 in position 0: invalid start byte报错
今天在使用vscode编译程序时,启动Python服务出现以下错误: 通过网络查找资料可以得知,是由于个人用户名非英文而导致,但是网上并没有说清楚是哪里的名字,以至于很多人会以为是以下地方: 实际上真 ...
- SpringBoot快速整合通用Mapper
前言 后端业务开发,每个表都要用到单表的增删改查等通用方法,而配置了通用Mapper可以极大的方便使用Mybatis单表的增删改查操作. 通用mapper配置 1.添加maven: <depen ...
- 机器学习-Kmeans
一.什么是聚类算法? 1.用于发现共同的群体(cluster),比如:邮件聚类.用户聚类.图片边缘. 2.聚类唯一会使用到的信息是:样本与样本之间的相似度(跟距离负相关) 给定N个训练样本(未标记的) ...
- 单调栈_Largest Rectangle in a Histogram
题面 https://flowus.cn/xjsc01/share/395ca9dc-315c-4bd5-a942-016709980c03 这里还有很多笔记(归纳好的) https://www.ac ...
- 《Python编程:从入门到实践》第19章笔记:用户/用户注册/身份验证
接上篇django最基本的一些日常用法,这是第19章笔记,希望在做"动手试一试"的时候可以让自己方便参考. 这一章实现了两个功能: 1.让用户能够添加主题Topic和条目Entry ...
- ES6中class方法及super关键字
ES6 class中的一些问题 记录下class中的原型,实例,super之间的关系 //父类 class Dad { constructor(x, y) { this.x = 5; this.y = ...
- ERROR: null value in column "name" of relation "res_company" violates not-null constraint
1 # 创建res.company公司信息的时候,发现它执行了两次create()方法,并且第二次调用create,传了一个[{}]做为参数 2 # 原因是,你创建res.company的时候并没有指 ...
- Odoo14 设置Binary字段默认值
1 # Odoo 中的附件也就是Binary字段都是经过特殊处理的 2 # 首先是上传的时候会进行base64编码后再上传到服务器 3 # 服务器进行压缩存放在odoo文件仓库中 4 # 每个odoo ...
- React报错之无法在未挂载的组件上执行React状态更新
正文从这开始~ 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以 ...