窗体中怎么让toolstrip漂浮(停靠已经做出来了)(C#)

界面里面无法漂浮。。。但是工具条确实可以再各个边缘停靠。。。请您帮忙。。

  DotNet2.0开发框架中提供的ToolStrip和ToolStripPanel控件可以方便开发具有可停靠工具栏功能的Windows应用程序, ToolStrip对象可以在各个ToolStripPanel间完成拖拽停靠,但是如果想实现类似VS IDE 或Office中可以浮动的工具栏必须借助于DevExpress等一些第三方的控件或编写一定的代码。 这里介绍一种比较简单的方法,只需继承ToolStrip类即可实现上述的效果。

  放置到ToolStripPanel上的,当工具栏浮动的时候,事实上是改变了其所在的容器对象,从其所在的ToolStripPanel移动到一个漂浮的容器上,因此要实现工具栏的浮动必须解决以下两个问题:

    必须有一个浮动的容器来承载ToolStrip对象。
    须知道ToolStrip对象何时改变其所在的容器,即在浮动的容器和主窗口上ToolStripPanel之间停靠。

  对于第一个问题,我们的解决方案是动态的创建一个Form类作为浮动的容器,命名为ToolStripFloatWindow,该Form对象具有以下的属性:

    FormBorderStyle = FixedToolWindow 边框样式
    ShowInTaskbar = false 不在任务栏显示
    ShowIcon = false 不显示窗口图标
    TopMost = true 在所有窗口之上

  为了解决第二个问题,我们查阅MSDN获知,当用鼠标拖拽ToolStrip对象释放鼠标时会触发其EndDrag事件。 我们在这个事件的处理方法中判断当ToolStrip对象的位置被移动到所在的ToolStripPanel之外的时候,创建ToolStripFloatWindow对象,并将ToolStrip对象移动到ToolStripFloatWindow上;要使ToolStrip对象恢复到原来的窗体上只要判断ToolStripFloatWindow对象的位置是否移动到了ToolStripPanel上, 当条件满足时将ToolStrip对象移动回ToolStripPanel中并销毁ToolStripFloatWindow对象。

  此外,还要解决当ToolStrip对象放置到ToolStripFloatWindow对象上时, ToolStripFloatWindow对象必须与ToolStrip对象的尺寸一致。 还有ToolStripFloatWindow对象被点击了关闭按钮时不能将自己关闭。我们可以做两个类来实现上述的思路。

ToolStripFloatWindow类继承自Form类。
MyToolStrip 继承自ToolStrip类。增加了相应的属性和方法。

MyToolStrip类的源代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

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

protected override void OnPaint(PaintEventArgs pe)
...{
// TODO: 在此处添加自定义绘制代码

// 调用基类 OnPaint
base.OnPaint(pe);
}

  漂浮状态#region 漂浮状态

private ToolStripFloatWindow floatWindow;

public ToolStripFloatWindow FloatWindow
...{
get
...{
return this.floatWindow;
}
set
...{
floatWindow = value;
if (FloatWindow != null)
...{
floatWindow.LocationChanged += new EventHandler(floatWindow_LocationChanged);
floatWindow.FormClosing += new FormClosingEventHandler(floatWindow_FormClosing);
}
}
}

public bool isFloating
...{
get
...{
return (floatWindow != null);
}
}

private ToolStripPanel tsPanel;

public ToolStripPanel ToolStripPanel
...{
get
...{
return this.tsPanel;
}
set
...{
tsPanel = value;
}
}

#endregion

  漂浮实现#region 漂浮实现

private void floatWindow_LocationChanged(object sender, EventArgs e)
...{
//当floatwindws的位置移动到 toolstrippanel中时,将this放置到 toolstripPanel上
if (this.floatWindow == null)
...{
return;
}
Point currentPt = new Point(floatWindow.Location.X, floatWindow.Location.Y);
Point minpt = this.tsPanel.PointToScreen(tsPanel.Location);
Point maxpt;
if(this.tsPanel.Height <= 20)...{
maxpt = new Point(minpt.X + this.tsPanel.Width, minpt.Y + 20);
}else...{
maxpt = new Point(minpt.X + this.tsPanel.Width, minpt.Y + this.tsPanel.Height);
}

if ((currentPt.X > minpt.X) && (currentPt.X < maxpt.X) && (currentPt.Y > minpt.Y) && (currentPt.Y < maxpt.Y))
...{
this.floatWindow.Controls.Remove(this);
this.tsPanel.SuspendLayout();
this.tsPanel.Controls.Add(this);
this.Location = this.tsPanel.PointToClient(currentPt);
this.tsPanel.ResumeLayout();
this.floatWindow.Dispose();
this.floatWindow = null;

}
}

private void MyToolStrip_EndDrag(object sender, EventArgs e)
...{
//判断移出时
if (this.tsPanel == null)
...{
MessageBox.Show("请先设置ToolStripPanel属性");
return;
}
Point endPoint = Cursor.Position;
int openX, openY;
openX = endPoint.X;
openY = endPoint.Y;
Point clientPt = this.tsPanel.Parent.PointToClient(endPoint);
if (clientPt.Y > tsPanel.Height)
...{
ToolStripFloatWindow fw = new ToolStripFloatWindow();
this.tsPanel.Controls.Remove(this);
fw.Controls.Add(this);
this.Left = 0;
this.Top = 0;
this.FloatWindow = fw;
Point newLoc = new Point(openX, openY);
fw.Show();
fw.Location = newLoc;
fw.SetBounds(newLoc.X, newLoc.Y, this.ClientSize.Width, this.ClientSize.Height);
}
}

private void floatWindow_FormClosing(object sender, FormClosingEventArgs e)
...{
e.Cancel = true;
}

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

#endregion

}
}

结论。 该方法实现较简单, 当不愿意使用功能较强大的第三方控件库时可以采用这种方法,缺点是负责浮动的容器是一个窗口,不大美观。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-25
把Toolstrip控件放在Toolstripcontainer容器控件里就可以漂浮。
第2个回答  2013-07-25
动态用户控件?

窗体中怎么让toolstrip漂浮(停靠已经做出来了)(C#)
我们在这个事件的处理方法中判断当ToolStrip对象的位置被移动到所在的ToolStripPanel之外的时候,创建ToolStripFloatWindow对象,并将ToolStrip对象移动到ToolStripFloatWindow上;要使ToolStrip对象恢复到原来的窗体上只要判断ToolStripFloatWindow对象的位置是否移动到了ToolStripPanel上, 当条件满足时将ToolStrip对象...

c# toolstrip怎么在窗口上移动
【1】“C# ToolStrip浮动及上\/下\/左\/右 停靠”(网页截图)【2】“Add docking and floating support easely and quickly with DockExtender”(英文)

关于C#窗体的ToolStripContainer侧板扩展
如果选不中整个控件的话.请右键控件,然后选择ToolStripContainer就和我这个一样了.之后点右上角箭头.这个可以修改是否显示某个方向.

C# toolstrip和toolstripcontainer 悬浮 停靠 事件
修改Dock属性。和修改锚定、——忘了怎么拼了。这两个属性。Dock是停靠,锚定是跟随。

C# 怎么控制toolStrip长短,那个size不起作用哦?
你把toolStrip 的dock属性设置成设置成none 同时把AutoSize属性设置为false 就可以用size来控制toolStrip的长短了,关于他的位置你可以用Anchor来控制。当然,dock属性为none后,toolStrip可能会挡在子窗体前面,你用一个panel设置其dock属性为top,然后在这个panel中加入那个toolStrip ,来模仿原toolStrip ...

C#中的状态栏中的进度条的位置怎么控制啊
点击你的form,观察size可以知道这个窗体的大小,再点击你的ToolStripProgressBar观察属性的location(位置),改变它的值即可!水平居中的具体计算方法如下:x=(form的长度-ToolStripProgressBar的长度)\/2 然后把x的值填到location x,y中即可~~垂直居中思路相同 一定有那个location属性的,我用的是VS...

C#中ToolStrip控件怎么把图像设置在上面文字放在下面 就像360浏览器的...
第一步: 按钮—属性—displaystyle 选择 ImageAndText 第二部: 按钮—属性—TextimageRelation 选择ImageAboveText

c#中如何让隐藏的toolstripmenuitem显示出来??
项的隐藏是不是在前台赋值了?如果是,请写在后台。加载事件中定义menustrip.items[1].visible=false;然后你什么时候需要显示,就在相应的事件里写入menustrip.items[1].visible=true;

如图,用c#做了一个画图程序,工具栏中使用的toolStripMenuItem中的checked...
建立一j个wMFC的SDI,然后在 resource界面里修改Toolbar,然后给每个u按钮编一n个n函数就好了l。哦,刚才j看到了r楼主追加的问题,是这样的: 2、如果你需要点一s下h就抬起来的效果,那么i在把ID和函数对应的时候要用 ON_COMMAND(ID_SAVE, &Cpix_editView::OnFileSave)这种形式 2、如果你需要点...

C# 窗体中 toolstrip控件下面有白边 怎么去掉?
使用toolstrip时,先将RenderMode设置为System,因为无法通过基本的设置属性除去;只需要重绘一下toolstrip即可,C#源代码如下:\/\/toolstrip重绘 private void toolStrip1_Paint(object sender, PaintEventArgs e){ if ((sender as ToolStrip).RenderMode == ToolStripRenderMode.System){ Rectangle rect =...

相似回答