您的位置:首页 > 编程语言 > C#

C# ToolStrip浮动及上/下/左/右 停靠

2013-12-16 09:55 351 查看
关于浮动工具条的制作,阿捷写了一篇很不错的文章,见:http://www.cnblogs.com/ajiefj/archive/2010/04/27/1722256.html

阿捷这个工具条浮动后只能在顶部停靠,基于此,我在这边增加在左/右/底部停靠,停靠条件是浮动窗体紧贴或越过主窗体边缘。

其实阿捷给出的代码已经相当详细了:) 我这里主要给出重写的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

    }

 

主窗体自然是放四个ToolStripPanel和一个MyToolStrip,注意主窗体的IsMdiContainer属性 置为 True
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: