C# 窗口停靠隐藏类 最近又修改了一下.使用更方便了
最近修改了一下.可以更方便的用在各个窗体上了
代码也简洁很多.直接引用一下就能使用
不过只处理了窗口的左上右三个方向 .下边没处理
/// <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
本文来自博客园,作者:jevan,转载请注明原文链接:https://www.cnblogs.com/DoNetCShap/archive/2012/06/26/2563075.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端