C# ToolStrip制作四边停靠浮动工具栏

关于浮动工具条的制作,阿捷写了一篇很不错的文章,见:http://www.jb51.net/article/44272.htm阿捷这个工具条浮动后只能在顶部停靠,基于此,我在这边增加在左/右/底部停靠,停靠条件是浮动窗体紧贴或越过主窗体边缘。

其实阿捷给出的代码已经相当详细了:) 我这里主要给出重写的ToolStrip代码段,增加了三个ToolStripPanel

代码如下:

public partial class MyToolStrip : ToolStrip
    {
        public MyToolStrip()
        {
            InitializeComponent();
            this.EndDrag += new EventHandler(MyToolStrip_EndDrag);
            this.SizeChanged += new EventHandler(MyToolStrip_SizeChanged);
        }

#region 漂浮状态

public ToolStripFloatWindow FloatWindow { get; set; }

private bool isFloating
        {
            get
            {
                return (FloatWindow != null);
            }
        }

public ToolStripPanel TopToolStripPanel { get; set; }
        public ToolStripPanel BottomToolStripPanel { get; set; }
        public ToolStripPanel LeftToolStripPanel { get; set; }
        public ToolStripPanel RightToolStripPanel { get; set; }

#endregion

#region 漂浮实现

private void FloatWindow_LocationChanged(object sender, EventArgs e)
        {
            //当floatwindws的位置移动到 toolstrippanel中时,将this放置到 toolstripPanel上
            if (this.FloatWindow == null)
            {
                return;
            }
            if (FloatWindow.HasCreated)
            {
                //主窗体位置
                Point frmLoc = this.TopToolStripPanel.Parent.Location;
                //浮动工具条位置
                Point toolBarLoc = FloatWindow.Location;

if (toolBarLoc.Y - frmLoc.Y <= 0) //置于顶部StripPanel
                {
                    this.FloatWindow.Controls.Remove(this);
                    this.TopToolStripPanel.SuspendLayout();
                    this.TopToolStripPanel.Controls.Add(this);
                    this.Location = this.TopToolStripPanel.PointToClient(toolBarLoc);
                    this.TopToolStripPanel.ResumeLayout();
                    this.FloatWindow.Dispose();
                    this.FloatWindow = null;
                    return;
                }
                if (toolBarLoc.X - frmLoc.X <= 0) //置于左边StripPanel
                {
                    this.FloatWindow.Controls.Remove(this);
                    this.LeftToolStripPanel.SuspendLayout();
                    this.LeftToolStripPanel.Controls.Add(this);
                    this.Location = this.LeftToolStripPanel.PointToClient(toolBarLoc);
                    this.LeftToolStripPanel.ResumeLayout();
                    this.FloatWindow.Dispose();
                    this.FloatWindow = null;
                    return;
                }
                if (toolBarLoc.X + FloatWindow.Width >= this.TopToolStripPanel.Parent.Width) //置于右边StripPanel
                {
                    this.FloatWindow.Controls.Remove(this);
                    this.RightToolStripPanel.SuspendLayout();
                    this.RightToolStripPanel.Controls.Add(this);
                    this.Location = this.RightToolStripPanel.PointToClient(toolBarLoc);
                    this.RightToolStripPanel.ResumeLayout();
                    this.FloatWindow.Dispose();
                    this.FloatWindow = null;
                    return;
                }
                if (toolBarLoc.Y + FloatWindow.Height >= this.TopToolStripPanel.Parent.Height) //置于底部StripPanel
                {
                    this.FloatWindow.Controls.Remove(this);
                    this.BottomToolStripPanel.SuspendLayout();
                    this.BottomToolStripPanel.Controls.Add(this);
                    this.Location = this.BottomToolStripPanel.PointToClient(toolBarLoc);
                    this.BottomToolStripPanel.ResumeLayout();
                    this.FloatWindow.Dispose();
                    this.FloatWindow = null;
                    return;
                }
            }
        }

private void MyToolStrip_EndDrag(object sender, EventArgs e)
        {
            Point screenPt = Cursor.Position;
            Point clientPt = this.TopToolStripPanel.Parent.PointToClient(screenPt);

//浮动区域
            Rectangle floatArea = new Rectangle(32, 32,    //我这里图标大小调整为32*32
                this.TopToolStripPanel.Parent.Width - 2 * 32,
                this.TopToolStripPanel.Parent.Height - 2 * 32);

if (floatArea.Contains(clientPt)) //判断移出时
            {
                ToolStripFloatWindow fw = new ToolStripFloatWindow();
                fw.Controls.Add(this);
                this.Left = 0;
                this.Top = 0;
                this.FloatWindow = fw;
                FloatWindow.LocationChanged += new EventHandler(FloatWindow_LocationChanged);
                fw.SetBounds(screenPt.X, screenPt.Y, this.ClientSize.Width, this.ClientSize.Height + 22); //22为窗体标题栏高度
                  fw.Show();
             }
        }

private void MyToolStrip_SizeChanged(object sender, EventArgs e)
        {
            if (this.isFloating)
            {
                this.FloatWindow.Width = this.ClientSize.Width;
            }
        }

#endregion

}

(0)

相关推荐

  • c#创建浮动工具栏功能示例

    所谓的浮动工具栏,效果图如下: 也就是说,可以将工具栏拖出其原先的停靠位置,而且可以将拖出来的工具栏再拖放回去. 实现的基本思路如下 1.拖动出来以后,需要创建一个大小合适的窗口,作为工具栏新的停靠容器,这个窗口可以这样设置: FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; ShowIcon = false; ShowInTaskbar = false; TopMost = true; 2.浮动工具栏

  • C# ToolStrip制作四边停靠浮动工具栏

    关于浮动工具条的制作,阿捷写了一篇很不错的文章,见:http://www.jb51.net/article/44272.htm阿捷这个工具条浮动后只能在顶部停靠,基于此,我在这边增加在左/右/底部停靠,停靠条件是浮动窗体紧贴或越过主窗体边缘. 其实阿捷给出的代码已经相当详细了:) 我这里主要给出重写的ToolStrip代码段,增加了三个ToolStripPanel 复制代码 代码如下: public partial class MyToolStrip : ToolStrip    {      

  • 使用jQuery制作浮动工具栏的实例分享

    现在大家在浏览网站的时候,经常会发现一些浮动的条状栏,通常具有向上向下的功能,当你点击一下,就可以方便的回到顶部或者前往底部.其实打造这样一个工具边栏,并不是很难,使用jquery很容易就可以做出来.下面,你跟随我的步骤,一步一步的做一下,就可以做出来了,然后你可以根据这个代码,进行一些修改,自定义一些东西. 废话不多说,先说一下我做的这个工具边栏.这个工具边栏是符合我自己做的模板"Q21",Q21模板的特点是黑白对比,所以这个工具边栏要突出黑白变化.经过构思之后,我决定这个边栏的样式

  • Qt Designer的简单使用方法

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用 C++ 代码编写的.窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了. 用 C++ 代码编写图形界面的问题就是不直观,因此 Qt 项目开发了专门的可视化图形界面编辑器--Qt Designer(Qt 设计师).通过 Qt Designer 就可以很方便地创建图形界面文件 *.ui ,然后将 ui 文件应用到源代码里面,做到"所见即所得",大大方便了图形界面的设计. 本节就演示一下

  • Winform学生信息管理系统主页面设计(2)

    在上次的学生登录窗口的设计(Winform学生信息管理系统登陆窗体设计(1))中,需要修改的地方为: 1.登录窗口的最大化和最小化,这个一般的登录窗口不需要,因此我们也不做,单击学生信息管理系统的窗体设计找到属性MaximizeBox和属性(窗口的最大化)和MinimizBox(窗口的最小化)是True,把它们改为False. 2.登录窗口设计的属性AcceptButton将其改为确定按钮的唯一名字(也就是button1),因此在按下回车键后我们也能登录到学生信息管理系统主页面. 3.在登录名称

  • 最新版 IDEA 2022.1 正式上线新功能一览

    目录 Java Java 18 支持 Java 反编译器 更好的 JUnit 5 支持 更新的 Surround with try/catch(使用 try/catch 环绕)模板 主要更新 Dependency Analyzer 增强了 New Project(新建项目)向导 新的 Notifications(通知)工具窗口 用户体验 New Project(新建项目)向导中的 Maven Archetype 改进的内嵌提示 将 UML 图表导出为其他格式 编辑器 从 Markdown 文件运

  • 如何制作浮动广告 JavaScript制作浮动广告代码

    如果有一定的JavaScript基础,制作浮动广告还是比较容易的.直接上代码了: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

  • Android应用中制作选中后图标变大浮动效果的代码分享

    最近在玩3g体育门户客户端的时候,看到这样个效果: 轻触赛事图标,会有一个图标变大浮出的效果.,蛮有意思的.于是就把仿照它做了一个.   这个是原图: 实际上是给图标的触摸事件中添加了一个缩放的动画,代码如下. package com.test; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import andro

  • Pjblog模板制作教程 超强推荐

    2007.1.30更新--转载自 http://www.dnxh.cn/blog/article.asp?id=155Pjblog的用户群越来越大,一个Blog就相当于一个Blogger网上的家.而现在追求个性的时代,给自己的Blog做过有个性的.符合自己特点的Skin是大家的一个愿望.但这个毕竟涉及到一些知识,我们需要通过自己的努力学习来完成我们的愿望.我将从零说起,大概是这样的一个过程:准备工作→Skin的构思→制图→切片→编写CSS→预览→调试兼容性→美化细节,预览和编写是个循环过程.我想

  • Qt模仿Visual Studio停靠窗口效果

    前言 众所周知,停靠窗口可以实现任意拖动效果,本文重点在于如何利用Qt制作与Visual Studio相似的带有停靠方向标及停靠区域预览的的停靠窗口框架. 效果图 功能 1.鼠标在中间方向标:叠加窗口2.鼠标在上下左右方向标:分割目标窗口,并紧挨着目标窗口周边位置添加新窗口3.鼠标在内部最上下左右方向标:目标窗口所在的最上下左右位置添加新窗口4.鼠标在外部最上下左右方向标:程序主窗口的最上下左右位置添加新窗口5.鼠标在Tab位置上:在当前所在tab页位置插入新窗口6.鼠标在Tab最右侧位置上:在

随机推荐