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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了窗体中怎么让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




结论。 该方法实现较简单, 当不愿意使用功能较强大的第三方控件库时可以采用这种方法,缺点是负责浮动的容器是一个窗口,不大美观。
参考技术A 把Toolstrip控件放在Toolstripcontainer容器控件里就可以漂浮。 参考技术B 动态用户控件?

C#如何让窗体中间一部分让鼠标透过

比如我在桌面上打开一个窗口,装口的背景是透明的,窗体上面有几个按钮,给人的感觉像是桌面多了几个按钮出来,这一步我可以做到,但是这里只是把窗口做透明了,并非不存在,也就是说如果你在这块透明的窗口上右击鼠标,你点击的是窗体,我想达到的在这块透明的地方可以让鼠标透过,点击的时候能点击到桌面

在windows操作系统,有一个dll专门负责鼠标穿透事件,穿透本质只针对设置色值区域,只要色值对得上的区域都能穿透,鼠标能直接操作覆盖的东西,色值对不上的区域正常显示。 参考技术A 窗体的TransparencyKey设置成red
然后把窗体的FormBorderStyle设置为None
窗体的BackColor设置为red
这样就可以使鼠标透过窗体点击到桌面追问

貌似我这个里面没FormBorderStyle这个属性呢,把这两个都设成RED的意思是弄透明对吧,那FormBorderStyle设成none如果没记错的话就是设边框的吧,你没懂我的问题,这只是把窗体设成了透明,还是不能点的到桌面的

追答

追问

C# VS2010.。。。。我这里貌似版本不对 是个试用版的,有些属性貌似找不到,晚上回去我去自己的电脑上试试看,如果可以的话分给你

追答

我也是VS2010,你那个属性找不到?

追问

FormBorderStyle这个,可能是版本问题吧,不对,找到了,刚刚是点错了,怪不得不对,可是不行,我点击不了

追答

你确定你设置了透明颜色以后还是无法点击?

追问

不行,这3个属性我都设了,不过我设的是黄色,这个应该没差别吧

追答

跟上面截图效果一样就是没有变法点过去?

追问

点不了

追答

你把3个属性的截图,还有运行的结果图给我,我看看

追问

追答

不知道了。可能跟.Net版本有关系吧。

本回答被提问者和网友采纳
参考技术B winform很难做到,用wpf做吧 挺简单。追问

。。。WPF貌似没接触过,我只是个菜鸟。。。。

追答

你创建一个wpf项目 把这个贴到xaml里试试

参考技术C 你说的这种情况貌似没有见过呢。理论上不是太好实现,因为电脑总要获取一个焦点的。你既然是个程序即使隐藏 了 但是只是视觉效果看不见,但是不代表他不存在。 而且这样做的意义究竟何在?建议换个别的方式进行实现。追问

我可以单个按钮实现,把窗体的大小弄到只有按钮那么大,然后把边框什么去掉,看上去就是屏幕上多了个按钮,而且按钮周围都可以点到桌面,但是如果多个这样的按钮就意味着我需要做多个这样的窗体,我想有多个按钮弄在一个窗体里面,使2个按钮中间的空白部分可以点击到桌面

就如这2个按钮,我就是这个方法做的,但是这两个按钮的中间部分是点击不到桌面的,因为这部分其实是有个透明的窗体存在的,

以上是关于窗体中怎么让toolstrip漂浮(停靠已经做出来了)(C#)的主要内容,如果未能解决你的问题,请参考以下文章

winfrom中ToolStrip 与toolbar 怎么设置浮动与停靠

C#中Toolstrip控件问题

C#怎么把子窗体中的comboBox1的值能够传到父窗体的toolStrip组件中的textbox中去么?能的话代码怎么写

C#winform中父窗体打开后下面有一排导航,导航打开子窗体,子窗体停靠在父窗体中间

如何在windows窗体里面添加窗口

ToolStrip控件左右拖拽移动效果实现