引用: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. 【Azure Developer】Github Action使用Azure/login@v1插件登录遇见错误的替代方案

    问题描述 在使用 Github Action  -  Azure/login@v1 的插件时候,登录中国区Azure遇见了问题. Login YAML 内容: - name: 'Login via A ...

  2. 【Azure 批处理 】Azure Batch门户中创建自定义作业模式失败解决办法

    问题描述 跟随官方文档,快速创建Azure批处理任务(快速入门:在 Azure 门户中运行第一个 Batch 作业),在添加作业时,选择"自定义模式",并添加文档中所提供的简单命令 ...

  3. 为什么HashMap的键值可以为null,而ConcurrentHashMap不行?

    写在开头 昨天在写<HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!>这篇文章的时候,漏了一个知识点,知道晚上吃饭的时候才凸显想到,关于Concur ...

  4. 如何使用疯狂URL获取抖音推流码地址(抖音推流码地址获取教程)

    本节所用到的工具:疯狂URL.OBS推流工具 什么是推流地址? 平时我们如果是下载直播,叫拉流.但如果是你自己要直播,属于上传直播流数据,叫推流,即:把直播流数据推送到视频服务器,然后别人才能看到直播 ...

  5. cache 本地&分布式(-redis) & JSON对象转换

    本地缓存 最简单的cache, 做一个map就行 private final Map<String,List<User>> cache=new HashMap<>( ...

  6. Dreamweaver基础教程:学习JavaScript

    目录 简介 用法 输出 语法 字面量 变量 操作符 语句 关键字 注释 数据类型 函数 函数表达式 Function() 构造函数 自调用函数 箭头函数 arguments 对象 使用构造函数调用函数 ...

  7. 在更新数据的时候,显示一个软件源里面没有Release文件

  8. MyEclipse设置自动提醒(补全)功能

    1. 打开MyEclipse,然后"window"→"Preferences" 2. 选择"java",展开,"Editor&qu ...

  9. Spring Boot学习日记14

    Thymeleaf 语法学习 简单表达式: 变量表达式:${...} 选择变量表达式:*{...} 消息表达式:#{...} 链接网址表达式:@{...} 片段表达式:~{...} 文字 文本文本:, ...

  10. 5G+实时云渲染,助力虚拟仿真实训教学升级

    随着新冠疫情走向全球大流行的发展趋势,学校教育被迫迁徙到线上教学平台,供需平衡被打破,疫情让"在线教学"成为"口罩式的刚需". 我们看到互联网+教育带来便利的同 ...