WinForm 简易仿360界面控件

因为经常要做一些1、2千行的小工具,WinForm自带的TabCtrl又不美观,所以想做成360的样子,在网上找来找去,都只有散乱的代码,没有可以通用的结构,于是自己写了一个简易的通用控件。

  控件主要功能

添加按钮和对应的Userctrl页面,或者相应的Action函数;整个控件是透明背景,窗体的背景将被作为整体背景,即支持类似换肤功能;可自定义按钮的遮罩绘制函数。

  • 支持Userctrl页面切换

WinForm 简易仿360界面控件

WinForm 简易仿360界面控件

  • 支持Action(无参数无返回值)委托

WinForm 简易仿360界面控件

主要类型实现

  • 切换按钮派生自RatioButton,因为已经实现了按钮单选功能。自定义的绘制函数功能是发博文前,为了功能齐全临时添加的,所以没有来得及详细测试,如有问题,请联系我或者自行修复。。。请不要在意变量名称和属性的混乱。。。
 using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms; namespace _360UI
{
public class MyButton : RadioButton。。。
{
private bool _enter;
public Image img;//不能使用原本的背景图片对象,自己的绘图函数使用。。。
public string txt;//同上
public int Id;
public static Action<Graphics, Rectangle> HoverDraw;//自定义hover函数
public static Action<Graphics, Rectangle> CheckedDraw;//自定义选中绘图函数
public static Color MaskColor = Color.FromArgb(, , , );//选中颜色
public static Color MaskColorHover = Color.FromArgb(, , , );//Hover颜色
public Action action;//自定义点击操作响应函数 public MyButton() : base()
{
AutoSize = false;
CheckAlign = ContentAlignment.MiddleCenter;
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
if (Checked)
{
if (CheckedDraw != null)
CheckedDraw(pevent.Graphics, this.ClientRectangle);
else
{
pevent.Graphics.FillRectangle(new SolidBrush(MaskColor), ClientRectangle);
}
}
else
{
if (_enter)
{
if (HoverDraw != null)
HoverDraw(pevent.Graphics, ClientRectangle);
else
pevent.Graphics.FillRectangle(new SolidBrush(MaskColorHover), ClientRectangle);
}
}
pevent.Graphics.DrawImage(img, , , Width - , Height - );
SizeF size = pevent.Graphics.MeasureString(txt, Font);
pevent.Graphics.DrawString(txt, Font, new SolidBrush(ForeColor), (Width - size.Width) / , Height-size.Height-);
} protected override void OnMouseEnter(EventArgs eventargs)
{
base.OnMouseEnter(eventargs);
_enter = true;
} protected override void OnMouseLeave(EventArgs eventargs)
{
base.OnMouseLeave(eventargs);
_enter = false;
} protected override void OnClick(EventArgs e)
{
base.OnClick(e);
if (action != null)
action();
}
}
}
  • 容器面板UI类:由FlowLayoutPanel和Panel构成的UserControl。FlowLayoutPanel保存切换按钮。
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using _360UI; namespace _360UI
{
public partial class UC_360UI: UserControl
{
private int maxID = ; public UC_360UI()
{
InitializeComponent();
} private void UC_360UI_Load(object sender, EventArgs e)
{
BackColor = Color.Transparent;
}
    //添加切换按钮
public void AddButton(Image image,string text,UserControl ctrl)
{
MyButton myButton = new MyButton();
myButton.Id = maxID++;
myButton.img = image;
myButton.txt = text;
myButton.Height = ButtonPan.Height-;
myButton.Width = ;
myButton.CheckedChanged += myButton_CheckedChanged;
ButtonPan.Controls.Add(myButton); CentenPan.Controls.Add(ctrl);
ctrl.BackColor = Color.Transparent;
ctrl.Visible = false;
ctrl.Dock = DockStyle.Fill;
}
public void AddButton(Image image, string text,Action action)
{
MyButton myButton = new MyButton();
myButton.Id = -;
myButton.img = image;
myButton.txt = text;
myButton.Height = ButtonPan.Height - ;
myButton.Width = ;
myButton.action = action;
ButtonPan.Controls.Add(myButton);
}
public void SelectItem(int id)
{
MyButton but = (MyButton)ButtonPan.Controls[id];
but.Checked = true;
}
void myButton_CheckedChanged(object sender, EventArgs e)
{
MyButton button = sender as MyButton;
CentenPan.Controls[button.Id].Visible = button.Checked;
}
}
}

测试界面代码

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using _360UI; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
uC_360UI1.AddButton(Properties.Resources.f111, "测试", new UserControl1());
uC_360UI1.AddButton(Properties.Resources.f12, "测试2", new UserControl2());
uC_360UI1.AddButton(Properties.Resources.f12, "测试3", new UserControl1());
uC_360UI1.AddButton(Properties.Resources.f12, "测试4", new UserControl2());
uC_360UI1.AddButton(Properties.Resources.f111, "关于",new Action(Myfun));
} void Myfun()
{
MessageBox.Show("Hello");
} private void Form1_Load(object sender, EventArgs e)
{
uC_360UI1.SelectItem(); }
}
}

说在最后

至此为止,一个简易的通用仿360界面控件就完成了,虽然代码量不多(喜欢短小的男人o(╯□╰)o),尽可能的添加了实用的功能,如果使用中遇到问题,请自行修复或者联系我。。。如果您觉得还不错,请点个赞或者留个言,算是对作者(笑)的一种鼓励和支持,谢谢,ヾ( ̄▽ ̄)Bye~Bye~。。。

 好吧,WINFORM已死,我知道。。。

上一篇:[转]oracle odp.net 32位/64位版本的问题


下一篇:different between unicorn / unicorn_rails