如何创建C#版浮动工具栏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建C#版浮动工具栏相关的知识,希望对你有一定的参考价值。

参考技术A 1、拖动出来以后,需要创建一个大小合适的窗口,作为工具栏新的停靠容器,这个窗口可以这样设置:

FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;

ShowIcon = false;

ShowInTaskbar = false;

TopMost = true;

2、浮动工具栏可以扩展自.Net
Framework提供的ToolStrip,它被拖动都某个位置,松开鼠标左键时,会触发EndDarg事件,在这个事件中,我们将其从原来的停靠容器中移除,同时根据鼠标左键松开时,在鼠标所在位置上创建一个窗口,作为工具栏的新容器。

这个就是基本的思路了,下面是浮动工具栏FloatToolstrip 具体的实现代码:

[csharp] view plain copy print?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace FloatToolStripDemo

public partial class FloatToolstrip : ToolStrip

private ToolStripPanel tsPanel;

public FloatToolstrip()

InitializeComponent();
this.EndDrag += new EventHandler(MyToolStrip_EndDrag);
this.SizeChanged += new EventHandler(MyToolStrip_SizeChanged);


private ToolStripFloatWindow floatForm;
public ToolStripFloatWindow FloatForm

get return floatForm;
set

floatForm = value;
if (floatForm != null)

floatForm.LocationChanged += new EventHandler(floatForm_LocationChanged);
floatForm.FormClosing += new FormClosingEventHandler(floatForm_FormClosing);




void floatForm_FormClosing(object sender, FormClosingEventArgs e)

e.Cancel = true;


private void floatForm_LocationChanged(object sender, EventArgs e)

//当floatwindws的位置移动到toolstrippanel中时,将this放置到 toolstripPanel上
if (this.floatForm == null)

return;

else

if (floatForm.HasCreated)

Point currentPt = new Point(floatForm.Location.X, floatForm.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 - 25) && (currentPt.Y < maxPt.Y - 25))

this.floatForm.Controls.Remove(this);
this.tsPanel.SuspendLayout();
this.tsPanel.Controls.Add(this);
this.Location = this.tsPanel.PointToClient(currentPt);
this.tsPanel.ResumeLayout();
this.floatForm.Dispose();
this.floatForm = null;





public bool isFloating

get

return (floatForm != null);



public ToolStripPanel ToolStripPanel

get

return this.tsPanel;

set

this.tsPanel = value;



private void MyToolStrip_EndDrag(object sender, EventArgs e)

//判断移除时
if (this.tsPanel == null)

MessageBox.Show("请先设置ToolStripPanel属性");
return;

Point dockPoint = Cursor.Position;
int openX, openY;
openX = dockPoint.X;
openY = dockPoint.Y;

Point clientPt = this.tsPanel.Parent.PointToClient(dockPoint);
if (clientPt.Y > tsPanel.Height)

ToolStripFloatWindow tsfw = new ToolStripFloatWindow();
this.tsPanel.Controls.Remove(this);
tsfw.Controls.Add(this);
this.Left = 0;
this.Top = 0;
this.FloatForm = tsfw;
Point newLoc = new Point(openX, openY);
tsfw.Show();
tsfw.Location = newLoc;
tsfw.SetBounds(newLoc.X, newLoc.Y, this.ClientSize.Width, this.ClientSize.Height+25);



private void MyToolStrip_SizeChanged(object sender, EventArgs e)

if (this.isFloating)

this.floatForm.Width = this.ClientSize.Width;





动态创建的作为浮动工具栏临时容器的窗口,需要加入一些处理技巧,以免发生在创建该窗口的工作尚未结束时,Dispose了这个窗口,这种情况发生在快速拖动工具栏时,触发了EndDrag事件,导致去创建临时窗口作为工具栏新的容器,而这时又将工具栏拖回原停靠容器中,会导致Dispose还没有创建完毕的临时窗口,发生异常!

C# 版dll 程序集合并工具

 

 微软的ILMerge工具。

下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=17630

这个支持将EXE依赖的DLL合并到EXE中,也支持将主DLL依赖的其他DLL合并到一个DLL,这个基本满足要求,唯一不足之处是没有GUI,每次使用敲命令很不方便,于是继续寻找,有ILMergeGUI 。

转自:http://www.cnblogs.com/sndnnlfhvk/p/5547427.html

以上是关于如何创建C#版浮动工具栏的主要内容,如果未能解决你的问题,请参考以下文章

带有 Appcompat 的浮动工具栏

C#调用OpenCV开发简易版美图工具

tinymce 工具栏浮动工具栏

类MacOSX的浮动工具栏VB源码(GDI),http://www.mndsoft.com/blog/VB6/1163.html,如何让其贴边自动隐藏

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

C# 版dll 程序集合并工具