引用: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. 解决xshell连不上ubuntu虚拟机

    分析 原因:虚拟机未安装ssh服务(Xshell远程连接需通过ssh协议) 解决方法 ubuntu安装ssh服务器 sudo apt-get install openssh-server 后续有问题可 ...

  2. 最经典的TCP性能问题

    目录 问题描述 问题的原因 什么是delay ack 什么是Nagle算法 如果client启用Nagle,并且server端启用了delay ack会有什么后果呢? 再来看一个经典例子和数据分析 回 ...

  3. docker使用 mysql8

    # docker pull mysql:8 # mkdir -p /mysql/{datadir,etc/mysql} # cat >/mysql/etc/mysql/my.cnf <&l ...

  4. [Python] 端口转发代码分享

    我的魔法被公司防火墙限制了,所以我只能让我的代理流量从我自己的服务器过一遍,但是服务器上面的客户端只能允许本机使用,不能开放公网访问,所以就想到了端口转发 但是网络上面找到的端口转发工具需要各种配置, ...

  5. 获取一段时间内,以月/季度为单位,第N天在各个月/季度是几几年几月几号

    /** * 获取一段时间内(可跨年),以季度为单位,第N天在各个季度是几月几号 * @param $sTime 时间戳 * @param $eTime 时间戳 * @param $number 第N天 ...

  6. vue-cli-plugin-electron-builder

    https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/#installation 用cnpm安装 cnpm install ...

  7. 手撕fft算法--fft原理和源码解析

    一 前言   在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊.   二 问题   这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...

  8. springboot+springsecurity+layui+cherryMd博客系统

    演示地址:http://175.24.198.63:9090/front/index PS: 演示环境的服务器配置很低,带宽很小,若打开速度较慢,稍微等等哦~ 现在动不动就是前后端分离,其实访问量不大 ...

  9. TornadoFx中的css美化

    原文地址:TornadoFx中的css美化 - Stars-One的杂货小窝 TornadoFx中使用类重新对css进行了封装,所以可以用代码的形式来书写样式 说明 除了Text,其他的若是要修改文字 ...

  10. stable diffusion安装及使用

    最近在看这个,踩了一些坑,现在有点头绪了,记录如下 安装很简单,直接git下载下来,然后进到根目录执行./web-ui.py,第一次启动你没有模型他会帮你下载个默认模型,我有模型了,就先把这个模型放到 ...