引用:https://www.cnblogs.com/lidj/archive/2012/07/06/2579923.html

最近修改了一下.可以更方便的用在各个窗体上了

代码也简洁很多.直接引用一下就能使用

不过只处理了窗口的左上右三个方向 .下边没处理

/// <summary>
/// 窗口停靠隐藏类
/// 使用方法
/// private FormDock formDock = null;
/// formDock = new FormDock(this,300);
/// </summary>
public class FormDock
{
#region 自定义声明
/// <summary>
/// 定义计时器
/// </summary>
private Timer StopRectTimer = new Timer(); /// <summary>
/// 贴边设置
/// </summary>
internal AnchorStyles StopAanhor = AnchorStyles.None; /// <summary>
/// 父级窗口实例
/// </summary>
private Form parentForm = null; private Point m_TempPoiont;//临时点位置
private Point m_LastPoint;//窗体最小化前的坐标点位置 #endregion #region 构造函数
/// <summary>
/// 自动停靠
/// </summary>
/// <param name="frmParent">父窗口对象</param>
public FormDock(Form frmParent)
{
parentForm = frmParent;
parentForm.LocationChanged += new EventHandler(parentForm_LocationChanged);
StopRectTimer.Tick += new EventHandler(timer1_Tick); //注册事件
StopRectTimer.Interval = 500; //计时器执行周期
StopRectTimer.Start(); //计时器开始执行
}
/// <summary>
/// 自动停靠
/// </summary>
/// <param name="frmParent">父窗口对象</param>
/// <param name="_trimInterval">时钟周期</param>
public FormDock(Form frmParent, int _trimInterval)
{
parentForm = frmParent;
parentForm.LocationChanged += new EventHandler(parentForm_LocationChanged);
StopRectTimer.Tick += new EventHandler(timer1_Tick); //注册事件
StopRectTimer.Interval = _trimInterval; //计时器执行周期
StopRectTimer.Start(); //计时器开始执行
}
#endregion /// <summary>
/// 时钟的开始
/// </summary>
public void TimerStart()
{
StopRectTimer.Start();
} /// <summary>
/// 时钟的停止
/// </summary>
public void TimerStop()
{
StopRectTimer.Stop();
} #region 窗口位置改变事件
/// <summary>
/// 窗口位置改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void parentForm_LocationChanged(object sender, EventArgs e)
{
if (parentForm.Location.X == -32000 && parentForm.Location.Y == -32000)
{
m_LastPoint = m_TempPoiont;//最小化了,m_LastPoint就是最小化前的位置。
}
else
{
m_TempPoiont = parentForm.Location;
} this.mStopAnthor();
}
#endregion #region 计时器 周期事件
/// <summary>
/// 计时器 周期事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
if (parentForm.Bounds.Contains(Cursor.Position))
{
this.FormShow();
}
else
{
this.FormHide();
}
}
#endregion #region 窗口停靠位置计算
/// <summary>
/// 窗口停靠位置计算
/// </summary>
private void mStopAnthor()
{
if (parentForm.Top <= 0)
{
StopAanhor = AnchorStyles.Top;
}
else if (parentForm.Left <= 0)
{
StopAanhor = AnchorStyles.Left;
}
else if (parentForm.Left >= Screen.PrimaryScreen.Bounds.Width - parentForm.Width)
{
StopAanhor = AnchorStyles.Right;
}
else
{
StopAanhor = AnchorStyles.None;
}
}
#endregion #region 窗体不贴边显示
/// <summary>
/// 窗体不贴边显示
/// </summary>
public void FormShow()
{
switch (this.StopAanhor)
{
case AnchorStyles.Top:
parentForm.Location = new Point(parentForm.Location.X, 0);
break;
case AnchorStyles.Left:
parentForm.Location = new Point(0, parentForm.Location.Y);
break;
case AnchorStyles.Right:
parentForm.Location = new Point(Screen.PrimaryScreen.Bounds.Width - parentForm.Width, parentForm.Location.Y);
break;
}
}
#endregion #region 窗体贴边隐藏
/// <summary>
/// 窗体贴边隐藏
/// </summary>
private void FormHide()
{
switch (this.StopAanhor)
{
case AnchorStyles.Top:
if (parentForm.WindowState == FormWindowState.Minimized)
{
parentForm.Location = this.m_LastPoint;
break;
}
parentForm.Location = new Point(parentForm.Location.X, (parentForm.Height - 2) * (-1));
break;
case AnchorStyles.Left:
parentForm.Location = new Point((-1) * (parentForm.Width - 2), parentForm.Location.Y);
break;
case AnchorStyles.Right:
parentForm.Location = new Point(Screen.PrimaryScreen.Bounds.Width - 2, parentForm.Location.Y);
break;
}
}
#endregion

C# 窗口停靠隐藏类的更多相关文章

  1. 借鉴网上的winform模仿QQ窗口停靠功能稍作改动

    2015-07-11 15:24:04 1 using System; using System.Collections.Generic; using System.ComponentModel; u ...

  2. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  3. WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性)

    原文:WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) 本文介绍如何使用 Windows 的 AppBar 相关 API 实现固定停靠在桌面上的特殊窗 ...

  4. 请解释ASP.NET 中的web 页面与其隐藏类之间的关系?

    一个ASP.NET 页面一般都对应一个隐藏类,一般都在ASP.NET 页面的声明中指定了隐藏类例如一个页面 Tst1.aspx 的页面声明如下 <%@ Page language="c ...

  5. 使用android 隐藏类和方法

    在应用程序中添加与android.jar包相同的包目录,添加要隐藏类和方法.保证能编译通过就可以.

  6. firefox快捷键窗口和标签类

    firefox快捷键窗口和标签类: 关闭标签: Ctrl+W 或 Ctrl+F4关闭窗口: Ctrl+Shift+W 或 Alt+F4向左移动标签: Ctrl+左方向键 或 Ctrl+上方向键向右移动 ...

  7. C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

    C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...

  8. 【Iterm2】如何解决iterm2窗口自动隐藏的问题

    一.问题描述 当我们使用Iterm2的Hotkey Windom功能时,通过快捷键唤起Iterm2窗口后,然后鼠标在iterm2窗口之外触发点击操作就会让 iterm2窗口自动隐藏.. 这样有时候会觉 ...

  9. 请解释ASP. NET中的web页面与隐藏类之间的关系

    请解释ASP.NET中的web页面与其隐藏类之间的关系 其实页面与其隐藏类之间就是一个部分类的关系,你在页面上放一个一个的控件就是在这个类中定义一个一个的属性, 因为是同一个类的部分类的关系,所以隐藏 ...

  10. 请解释ASP.NET中的web页面与其隐藏类之间的关系

    其实页面与其隐藏类之间就是一个部分类的关系,你在页面上放一个一个的控件就是在这个类中定义一个一个的属性, 因为是同一个类的部分类的关系,所以隐藏类可以访问到页面上控件,这样做是为了把展现与处理逻辑分开 ...

随机推荐

  1. 【防忘笔记】一个例子理解Pytorch中一维卷积nn.Conv1d

    一维卷积层的各项参数如下 torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1 ...

  2. 1-Django框架简介以及基本操作

    安装 注意:安装的磁盘目录,以及后续通过Django创建目录的时候,不要出现中文,否则会出现预料之外的错误 建议:禁止套娃,即不要在A项目中创建B项目 # 如果不指定版本号,默认最新版 pip ins ...

  3. maven创建父子工程

    目录 创建父工程 创建子工程 将项目编译为eclipse项目 将项目导入eclipse 修改依赖关系:service依赖dao,web依赖service JavaProject的pom.xml文件说明 ...

  4. 【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面

    问题描述 在App Service Linux环境中,如部署Tomcat 应用后,如果访问的页面找不到,应用会返回一个由Azure生成的404页面,那么是否可以修改它呢? PS: 如果是App Ser ...

  5. nmcli命令详解(创建热点,连接wifi,管理连接等)

    目录 简述 语法 比较有用的选项(OPTION) 对象 general对象(常规信息) 用途 语法 networking对象(整个网络) 用途 语法 命令示例 radio对象(无线开关) 用途 语法 ...

  6. Jmeter 之正则表达式的使用

    1 背景及用途: html.json数据都可以转化为文本,提供给正则去提取,使用正则可以提取全部数据,这就是正则表达式非常强大的一点. html格式响应更适合用xpath提取,性能比正则好一点 jso ...

  7. nginx应用及性能调优

    1. Nginx 反向代理实现 说反向代理之前 先说什么是正向代理, 正向代理是指客户端通过 代理服务器访问目标服务器,客户端直接访问代理服务器,在由代理服务器访问目标服务器并返回客户端并返回 . 例 ...

  8. C++ //模板案例-数组封装类

    1 //模板案例-数组封装类 2 //描述 3 //实现一个通用的数组类 4 //1.可以对内置数据类型以及自定义数据类型的数据进行储存 5 //2.将数组很脏的数据储存到堆区 6 //3.构造函数中 ...

  9. Mybatis中使用choose/when语句采坑记

    项目中写查询语句的时候,时常会使用到Mybatis中的choose/when语句,根据不同的条件执行不同的分支. 最近在使用这个语句的时候,出现问题导致这个语句不能正确执行,排查很久才解决这个问题,因 ...

  10. Kotlin学习快速入门(10)—— 重载运算符使用

    原文:Kotlin学习快速入门(10)-- 重载运算符使用 - Stars-One的杂货小窝 Kotlin中提供了基础的运算符,但是只是针对基础的数据类型,如Int,Double等 如果我们想让两个对 ...