目录
创建 Window 窗体应用(.NET Framework) 项目(不演示操作过程)
关于自定义控制栏
我们在编写Winform程序时,也许会发现窗体默认的样式不足以满足我们的功能需求,或者控制栏样式不够漂亮,那么我们可能会考虑自行编写一个控制栏控件,或者使用已有的外部插件来满足我们的需求。
(在这里,主要介绍使用自定义用户控件去实现控制栏)
使用用户控件
我们可以自定义一个控制栏控件,其功能均自己定义/制作,即可突破默认控制栏的些许限制。
使用外部插件
我们可以在 “拓展-管理拓展” 中看到“管理拓展”窗口,如图1
在“管理拓展”窗口中,我们可以右上角的“搜索框”中搜索并找到我们需要的第三方窗口样式下载并使用。
由于作者本人也并没有使用过这些拓展,所以就不详细写出可以使用哪个拓展、该如何使用了。
但这里有一个Microsoft提供的相关链接可以提供参考。
实现自定义控制栏
创建 Window 窗体应用(.NET Framework) 项目(不演示操作过程)
在此之前,我已经新建了一个名为“demo”的解决方案,其中有一个名为“WindowFormsApp1”的“Windows 窗体应用(.NET Framework)”项目,以此项目来演示效果,并且可以看到该项目默认有一个名为“Form1”的窗体,他的样式是这样的,如图2
更改窗体FormBorderStyle属性
首先,我们肯定是不需要系统默认的样式的,因此我们就需要把窗体的“FormBorderStyle”属性改成“None”,如图3
这时候你会发现窗口变成了一个白块,已经没有了边框和控制栏,如图4
此时,如果你尝试启动项目,你会发现这个窗口无法被拖动,也没有了最小化/最大化/关闭按钮。
作为演示,我仅制作部分功能和样式,实现基础的功能。
添加自定义用户控件
在“WindowsFormApp1”项目中右键选择“添加-用户控件(Windows 窗体)”,如图5
将其命名为“ControlBar”,并为其添加部分基础控件,并设置样式和布局,如图6
ControlBar用户控件(512*32):
pictureBox_title,16*16
label_title,
button_setup,32*32
button_min,32*32
button_max,32*32
button_close,32*32
ControlBar内的基础控件布局好后,可以为其导入合适的图片用作于按钮,且编写部分基础代码,用于储存基本数据和实现部分逻辑。
ControlBar的代码逻辑如下:
public partial class ControlBar : UserControl
{
public Form form { get; set; }//控件的窗体
public Image imgButtonMax { get; set; } = new Bitmap(Properties.Resources.Maximize_16x16);//最大化图片
public Image imgButtonMaxCancel { get; set; } = new Bitmap(Properties.Resources.MaximizeCancel_16x16);//取消最大化图片
private bool isEnableWindowDrag { get; set; } = false;//是否启用窗口拖动
private bool isEnableButtonMinimize { get; set; } = false;//是否启用最小化按钮
private bool isEnableButtonMaximize { get; set; } = false;//是否启用最大化按钮
private bool isEnableButtonClose { get; set; } = false;//是否启用关闭按钮
public Point MousePoint { get; set; }
public ControlBar()
{
InitializeComponent();
}
//启用控制栏
public void EnableControlBar(Form form2)
{
form = form2;
EnableControlDragWindow(true);//启用窗口拖动
EnableButtonMinimizeClick(true);//启用最小化按钮
EnableButtonMaximizeClick(true);//启用最大化按钮
EnableButtonCloseClick(true);//启用关闭按钮
}
//启用控制栏
public void EnableControlBar(Image image,string str,Form form2)
{
pictureBox_title.BackgroundImage = image;
label_title.Text = str;
form = form2;
EnableControlDragWindow(true);//启用窗口拖动
EnableButtonMinimizeClick(true);//启用最小化按钮
EnableButtonMaximizeClick(true);//启用最大化按钮
EnableButtonCloseClick(true);//启用关闭按钮
}
//================================================================窗口拖动
//窗口拖动的条件
private bool WindowDragCondition(MouseEventArgs mouseEventArgs)
{
return form.WindowState == FormWindowState.Normal && mouseEventArgs.Button == MouseButtons.Left;
}
//窗口拖动-鼠标摁下
private void WindowDragMouseDownControl(object sender, MouseEventArgs e)
{
if (WindowDragCondition(e))
{
MousePoint = new Point(e.X, e.Y);
}
}
//窗口拖动-鼠标松开
private void WindowDragMouseMoveControl(object sender, MouseEventArgs e)
{
if (WindowDragCondition(e))
{
form.Location = new Point(form.Location.X + e.X - MousePoint.X, form.Location.Y + e.Y - MousePoint.Y);
}
}
//是否启用控件拖动窗口
public void EnableControlDragWindow(bool value)
{
if (isEnableWindowDrag != value)
{
if (value)
{
this.MouseDown += new MouseEventHandler(WindowDragMouseDownControl);
this.MouseMove += new MouseEventHandler(WindowDragMouseMoveControl);
}
else
{
this.MouseDown -= new MouseEventHandler(WindowDragMouseDownControl);
this.MouseMove -= new MouseEventHandler(WindowDragMouseMoveControl);
}
isEnableWindowDrag = value;
}
}
//================================================================窗口最小化
public void ButtonMinimizeClick(object sender, EventArgs e)
{
form.WindowState = FormWindowState.Minimized;
}
//是否启用最小化按钮
public void EnableButtonMinimizeClick(bool value)
{
if (isEnableButtonMinimize != value)
{
if (value)
{
button_min.Click += new EventHandler(ButtonMinimizeClick);
}
else
{
button_min.Click -= new EventHandler(ButtonMinimizeClick);
}
isEnableButtonMinimize = value;
}
}
//================================================================窗口最大化
public void ButtonMaximizeClick(object sender, EventArgs e)
{
if (form.WindowState == FormWindowState.Maximized)
{
form.WindowState = FormWindowState.Normal;
button_max.BackgroundImage = imgButtonMax;
}
else
{
form.WindowState = FormWindowState.Maximized;
button_max.BackgroundImage = imgButtonMaxCancel;
}
}
//是否启用最小化按钮
public void EnableButtonMaximizeClick(bool value)
{
if (isEnableButtonMaximize != value)
{
if (value)
{
button_max.Click += new EventHandler(ButtonMaximizeClick);
}
else
{
button_max.Click -= new EventHandler(ButtonMaximizeClick);
}
isEnableButtonMaximize = value;
}
}
//================================================================窗口关闭
public void ButtonCloseClick(object sender, EventArgs e)
{
form.Close();
}
public void EnableButtonCloseClick(bool value)
{
if (isEnableButtonClose != value)
{
if (value)
{
button_close.Click += new EventHandler(ButtonCloseClick);
}
else
{
button_close.Click -= new EventHandler(ButtonCloseClick);
}
isEnableButtonClose = value;
}
}
}
Form1的代码逻辑如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Image image = new Bitmap(Properties.Resources.Tian_32x32);
string str = "演示标题";
controlBar1.EnableControlBar(this);
controlBar2.EnableControlBar(image,str,this);
}
}
ControlBar、Form1样式如下:
自定义控制栏效果
该演示中展示了,ControlBar控件拖动窗口的效果,另外还拥有最小化、最大化、向下还原、关闭窗口的基础功能。但有一个齿轮按钮作者并未写任何逻辑效果,主要目的仅是展示自定义控制栏的自由性,根据以上图片不难看出,其控制栏可以自定义若干个按钮、标题,图标,由你设计。
由于该文章仅是演示,其中ControlBar的很多控件布局是写死的。你可以根据你的所需,设计动态的布局,甚至是变化多端的布局。