创建一个";浮动;不带WPF的C#(WinForm应用程序)中的控件

创建一个";浮动;不带WPF的C#(WinForm应用程序)中的控件,c#,winforms,layout,controls,C#,Winforms,Layout,Controls,我想创建一个“浮动”控件,就像VisualStudio的控件(例如,解决方案资源管理器) 我怎样才能实现这样的事情 谢谢。我认为WinForms没有任何内置功能,但有几个第三方控件支持此功能 一组流行的控件是Telerik的控件: 另一个是来自忘恩负义者的控制: 这两个都是商业软件包,我不知道有哪一个免费软件包提供相同的功能。这对我很有用: using System; using System.Collections.Generic; using System.Linq; using Syste

我想创建一个“浮动”控件,就像VisualStudio的控件(例如,解决方案资源管理器)

我怎样才能实现这样的事情


谢谢。

我认为WinForms没有任何内置功能,但有几个第三方控件支持此功能

一组流行的控件是Telerik的控件:

另一个是来自忘恩负义者的控制:

这两个都是商业软件包,我不知道有哪一个免费软件包提供相同的功能。

这对我很有用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Windows.Forms;
using LollipopUIControls.UIManagers;

namespace Gamasis.Apps.Controls
{
public class FloatingButton : Button
{
public FloatingButton()
{
    SetStyle((ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint), true);
    DoubleBuffered = true;

    Size = new Size(50, 50);
    BackColor = Color.Transparent;

    SF.Alignment = StringAlignment.Center;
    SF.LineAlignment = StringAlignment.Center;

    AnimationTimer.Tick += new EventHandler(AnimationTick);
}

#region  Variables

Timer AnimationTimer = new Timer { Interval = 1 };

FontManager font = new FontManager();
StringFormat SF = new StringFormat();
Rectangle StringRectangle;

bool Focus = false;
int margintop = 0, marginleft = 0, marginright = 0, marginBottom = 0;
int xx;
int yy;

float SizeAnimation = 0;
float SizeIncNum;

string fontcolor = "#FAFAFA";
string Backcolor = "#039BE5";

Color EnabledBGColor;
Color EnabledBorderColor;
Color StringColor;

Color DisabledBGColor = ColorTranslator.FromHtml("#B0BEC5");
Color DisabledStringColor = ColorTranslator.FromHtml("#FAFAFA");
Color NonColor = ColorTranslator.FromHtml("#e3e5e7");

Image bGImage = null;


#endregion

#region  Properties
[Category("Custom")]
public string BGColor
{
    get { return Backcolor; }
    set
    {
        Backcolor = value;
        Invalidate();
    }
}
[Category("Custom")]
public string FontColor
{
    get { return fontcolor; }
    set
    {
        fontcolor = value;
        Invalidate();
    }
}

[Browsable(false)]
public Font Font
{
    get { return base.Font; }
    set { base.Font = value; }
}

[Browsable(false)]
public Color ForeColor
{
    get { return base.ForeColor; }
    set { base.ForeColor = value; }
}

[Category("Custom")]
public Image BGImage
{
    get { return bGImage; }
    set { bGImage = value; }
}

ImageSizeLevel bGimgSize = ImageSizeLevel.peque2;

public ImageSizeLevel BGimgSize
{
    get { return bGimgSize; }
    set { bGimgSize = value; }
}
#endregion

#region Events
protected override void OnMouseEnter(EventArgs e)
{
    base.OnMouseEnter(e);

    EnabledBGColor = Color.FromArgb(30, ColorTranslator.FromHtml(BGColor));//StringColor);
    EnabledBorderColor = Color.FromArgb(20, ColorTranslator.FromHtml(BGColor));//StringColor);
    Refresh();
}
protected override void OnMouseLeave(EventArgs e)
{
    base.OnMouseLeave(e);

    EnabledBGColor = ColorTranslator.FromHtml(BGColor);
    EnabledBorderColor = ColorTranslator.FromHtml(BGColor);
    Refresh();
}
protected override void OnMouseDown(MouseEventArgs e)
{
    base.OnMouseDown(e);

    EnabledBGColor = Color.FromArgb(30, StringColor);
    Refresh();

    xx = e.X;
    yy = e.Y;

    Focus = true;
    AnimationTimer.Start();
    Invalidate();
}
protected override void OnMouseUp(MouseEventArgs e)
{
    base.OnMouseUp(e);
    Focus = false;
    AnimationTimer.Start();
    Invalidate();
}

protected override void OnTextChanged(System.EventArgs e)
{
    base.OnTextChanged(e);
    Invalidate();
}
protected override void OnSizeChanged(EventArgs e)
{
    base.OnSizeChanged(e);
    //StringRectangle = new Rectangle(3, 0, Width - 6, Height - 6);
}
#endregion

protected override void OnResize(System.EventArgs e)
{
    base.OnResize(e);
    //SizeIncNum = Width / 34;
    SizeIncNum = Width / 10;

}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var G = e.Graphics;


    #region Default rectangle
    //G.SmoothingMode = SmoothingMode.HighQuality | SmoothingMode.AntiAlias;
    //G.Clear(Parent.BackColor);

    //StringColor = ColorTranslator.FromHtml(fontcolor);

    //var BG = DrawHelper.CreateRoundRect(1, 1, Width - 3, Height - 3, 1);
    //Region region = new Region(BG);

    //G.FillPath(new SolidBrush(Enabled ? EnabledBGColor : Color.White), BG);
    //G.DrawPath(new Pen(Enabled ? EnabledBorderColor : Color.White), BG);

    //G.SetClip(region, CombineMode.Replace);

    ////The Ripple Effect
    //G.FillEllipse(new SolidBrush(Color.FromArgb(30, StringColor)), xx - (SizeAnimation / 2), yy - (SizeAnimation / 2), SizeAnimation, SizeAnimation);

    //G.DrawString(Text, font.Roboto_Medium10, new SolidBrush(Enabled ? StringColor : DisabledStringColor), R, SF);

    #endregion

    #region Circle

    //G.SmoothingMode = SmoothingMode.AntiAlias;
    //G.Clear(BackColor);

    //GraphicsPath bgbtn = new GraphicsPath();
    //bgbtn.AddEllipse(0, 0, Width - 5, Height - 5);

    //GraphicsPath bgShadow = new GraphicsPath();
    //bgShadow.AddEllipse(0, 0, Width - 2, Height - 2);

    //G.FillPath(new SolidBrush(NonColor), bgShadow);
    //G.DrawPath(new Pen(NonColor), bgShadow);

    //G.FillPath(new SolidBrush(Color.DeepSkyBlue), bgbtn);            
    //G.DrawPath(new Pen(Color.DeepSkyBlue), bgbtn);

    #endregion


    ///----------------------------
    G.SmoothingMode = SmoothingMode.AntiAlias;
    G.Clear(Parent.BackColor);

    StringColor = ColorTranslator.FromHtml(fontcolor);

    //var BG = DrawHelper.CreateRoundRect(1, 1, Width - 3, Height - 3, 1);
    //Círculo principal
    GraphicsPath bgbtn = new GraphicsPath();
    bgbtn.AddEllipse(2, 0, Width - 6, Height - 6);

    //Círculo para la sombra
    GraphicsPath bgShadow = new GraphicsPath();
    bgShadow.AddEllipse(2, 4, Width - 6, Height - 6);

    // se dibuja la sombra
    G.FillPath(new SolidBrush(NonColor), bgShadow);
    G.DrawPath(new Pen(NonColor), bgShadow);

    //sedibuja el círculo principal sobre la sombra
    G.FillPath(new SolidBrush(Enabled ? ColorTranslator.FromHtml(BGColor) : DisabledBGColor), bgbtn);
    G.DrawPath(new Pen(Enabled ? ColorTranslator.FromHtml(BGColor) : DisabledBGColor), bgbtn);

    // Se da a la región forma de círculo/elipse
    Region region = new Region(bgbtn);//BG);
    G.SetClip(region, CombineMode.Replace);

    //The Ripple Effect
    if (Enabled)
        G.FillEllipse(new SolidBrush(Color.FromArgb(30, EnabledBGColor)), xx - (SizeAnimation / 2), yy - (SizeAnimation / 2), SizeAnimation, SizeAnimation);
    StringRectangle = new Rectangle((int)bgbtn.GetBounds().Location.X, (int)bgbtn.GetBounds().Location.Y,
        (int)bgbtn.GetBounds().Size.Width, (int)bgbtn.GetBounds().Size.Height);
    G.DrawString(Text, font.Roboto_Medium15, new SolidBrush(Enabled ? StringColor : DisabledStringColor), StringRectangle, SF);
    if (bGImage != null)
    {
        float imgX = 0, imgY = 0;
        imgY = (bgbtn.GetBounds().Size.Height - (int)bGimgSize) / 2;
        imgX = ((bgbtn.GetBounds().Size.Width - (int)bGimgSize) + 2) / 2;
        G.DrawImage(bGImage, imgX, imgY, (float)bGimgSize, (float)bGimgSize);
    }
}

protected void AnimationTick(object sender, EventArgs e)
{
    if (Focus)
    {
        if (SizeAnimation < Width + 250)
        {
            SizeAnimation += SizeIncNum;
            this.Invalidate();
        }
    }
    else
    {
        if (SizeAnimation > 0)
        {
            SizeAnimation = 0;
            this.Invalidate();
        }
    }
}

public enum ImageSizeLevel
{
    peque = 12, peque1 = 24, peque2 = 32,
    maso = 48, maso1 = 56, maso2 = 64,
    grande = 72, grande1 = 86, grande2 = 96,
    monstruo = 128, monstruo1 = 256, monstruo2 = 512
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统组件模型;
使用系统图;
使用System.Drawing.Drawing2D;
使用System.Drawing.Text;
使用System.Windows.Forms;
使用LollipopUIControls.ui管理器;
命名空间Gamasis.Apps.Controls
{
公共类浮动按钮:按钮
{
公共浮动按钮()
{
设置样式((ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDubleBuffer | ControlStyles.ResizerDraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint),true);
双缓冲=真;
尺寸=新尺寸(50,50);
背景色=颜色。透明;
SF.Alignment=StringAlignment.Center;
SF.LineAlignment=StringAlignment.Center;
AnimationTimer.Tick+=新事件处理程序(AnimationTick);
}
#区域变量
计时器动画计时器=新计时器{Interval=1};
FontManager字体=新FontManager();
StringFormat SF=新的StringFormat();
矩形串矩形;
bool Focus=false;
int margintop=0,marginleft=0,marginright=0,marginBottom=0;
int xx;
int-yy;
float SizeAnimation=0;
浮点数;
字符串fontcolor=“#FAFAFA”;
字符串Backcolor=“#039BE5”;
颜色使能的颜色;
启用颜色的OrderColor;
颜色;
Color DISABLEDBGCLOR=ColorTranslator.FromHtml(“#B0BEC5”);
Color DisabledStringColor=ColorTranslator.FromHtml(“#fafafafa”);
Color NONCLOR=ColorTranslator.FromHtml(“#e3e5e7”);
图像bGImage=null;
#端区
#区域属性
[类别(“海关”)]
公共字符串颜色
{
获取{return Backcolor;}
设置
{
背景色=值;
使无效();
}
}
[类别(“海关”)]
公共字符串字体颜色
{
获取{return fontcolor;}
设置
{
fontcolor=值;
使无效();
}
}
[可浏览(错误)]
公共字体
{
获取{return base.Font;}
设置{base.Font=value;}
}
[可浏览(错误)]
公共颜色前景色
{
获取{return base.ForeColor;}
设置{base.ForeColor=value;}
}
[类别(“海关”)]
公众形象
{
获取{返回bGImage;}
设置{bGImage=value;}
}
ImageSizeLevel bGimgSize=ImageSizeLevel.peque2;
公共图像SizeLevel BGimgSize
{
获取{return bGimgSize;}
设置{bGimgSize=value;}
}
#端区
#地区活动
MouseCenter上受保护的覆盖无效(事件参数e)
{
base.onmouseinter(e);
EnabledBGColor=Color.FromArgb(30,ColorTranslator.FromHtml(BGColor));//StringColor);
EnabledBorderColor=Color.FromArgb(20,ColorTranslator.FromHtml(BGColor));//StringColor);
刷新();
}
MouseLeave上的受保护覆盖无效(事件参数e)
{
基地,离港(e);;
EnabledBGColor=ColorTranslator.FromHtml(BGColor);
EnabledBorderColor=ColorTranslator.FromHtml(BGColor);
刷新();
}
MouseEventArgs e上的受保护覆盖无效(MouseEventArgs e)
{
base.OnMouseDown(e);
EnabledBGColor=Color.FromArgb(30,StringColor);
刷新();
xx=e.X;
yy=e.Y;
焦点=真;
AnimationTimer.Start();
使无效();
}
MouseUp上的受保护覆盖无效(MouseEventArgs e)
{
base.OnMouseUp(e);
焦点=错误;
AnimationTimer.Start();
使无效();
}
受保护的覆盖void OnTextChanged(System.EventArgs e)
{
base.OnTextChanged(e);
使无效();
}
IzeChanged上的受保护覆盖无效(EventArgs e)
{
基地.OnSizeChanged(e);
//StringRectangle=新矩形(3,0,宽度-6,高度-6);
}
#端区
受保护的覆盖void OnResize(System.EventArgs e)
{
基数(e);
//SizeIncNum=宽度/34;
SizeIncNum=宽度/10;
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
var G=e.图形;
#区域默认矩形
//G.SmoothingMode=SmoothingMode.HighQuality | SmoothingMode.AntiAlias;
//G.清晰(母色、背景色);
//StringColor=ColorTranslator.FromHtml(fontcolor);
//var BG=DrawHelper.CreateRoundRect(1,1,宽度-3,高度-3,1);
//区域=新区域(BG);
//G.FillPath(新的SolidBrush(启用?启用DBGColor:Color.White),背景);
//G.DrawPath(新笔(启用?启用DBOrderColor:Color.White),背景);
//G.SetClip(区域、组合模式、更换);
////连锁反应
//G.FillEllipse(新的SolidBrush(颜色来自Argb(30,StringColor)),xx-(尺寸图像化/2),yy-(尺寸图像化/2),尺寸图像化,尺寸图像化);
//G.DrawString(文本,font.Roboto_Medium10,新SolidBrush(已启用?StringColor:DisabledStringColor),R,SF);
#端区
#区域圈
//G.SmoothingMode=SmoothingMode.AntiAlias;
//G.清晰(背景色);
//GraphicsPath bgbtn=新的GraphicsPath();
//bgbtn.AddEllipse(0,0,宽度-5,高度-5);
//GraphicsPath bgShadow=新的GraphicsPath();
//bgShadow.AddEllipse(0,0,宽度-2,高度-2);
//G.FillPath(新的SolidBrush(非彩色),bgShadow);
//G.绘图路径(新笔(非彩色),bgShadow;
//G.FillPath(新的SolidBrush(颜色深蓝),bgbtn);
//G.DrawPath(新笔(颜色深蓝),bgbtn);
#端区
///----------------------------
G.SmoothingMode=SmoothingMode.AntiAlias;
G.清晰(母色、背景色);
StringColor=ColorTranslator.FromHtml(fontcolor);
//var BG=DrawHelper.CreateRoundRect(1,1,宽度-3,高度-3,1);
//Círculo校长
GraphicsPath bgbtn=新的GraphicsPath();
bgbtn.AddEllip