说明:
因WinForm本身的窗体界面太过传统,需要自定义标题栏部分时,又因修改难度较大或始终有点不理想,基于对于C#的热爱,只好选择动手纯代码绘制,所以记录了此文章,以作备用。
原理:
通过设置原窗体属性为无边框属性,再通过OnPaint绘制标题栏部分(实则是在客户区绘制一个模拟标题栏)并实现其基本功能。
新增属性:
CaptionColor:标题栏的背景色。默认颜色:WhiteSmoke。
ShowCaption:是否显示窗体标题栏及其控件。默认值:true。
CaptionHeight:标题栏的高度。默认值:50。
ShowCaptionLine:是否显示标题栏与客户区的分界线。默认值:false。
CloseMode:关闭窗体时执行的操作。Exit退出程序,HideToNotify隐藏到通知栏。默认值:Exit。
NotifyIcon:当程序需要在通知栏显示图标时,通知栏显示的图标。默认值:窗体图标。
NotifyMenuStrip:当程序需要在通知栏显示图标时,鼠标右键点击通知栏图标后显示的菜单项。默认值:空。
NotifyVisible:指示程序的通知栏图标无论是否窗口关闭都显示。默认值:false。
窗体截图:
1、当ShowCaption属性值为FALSE时,窗体为一个不含任何控件的四周阴影、可拖拽窗体。此时鼠标在窗体内任何部位按下均可进行窗体的拖拽操作。
2、当ShowCaption属性值为TRUE时,窗体为一个包含标题栏的四周阴影、可拖拽窗体。此时鼠标仅在标题栏范围内按下才可进行窗体的拖拽操作。
3、当窗体的MaximizeBox属性值为FALSE时,窗体的大小是不可调整的。
源代码:
namespace DotNetFramework.WinForm.Forms
{
public class Form : System.Windows.Forms.Form
{
#region 属性
private readonly System.Windows.Forms.NotifyIcon NotifyIconMain = new System.Windows.Forms.NotifyIcon();
/// <summary>
/// 初始化部分
/// </summary>
private void InitializeComponent()
{
SuspendLayout();
BackColor = System.Drawing.Color.White;
ClientSize = new System.Drawing.Size(800, 450);
ControlBox = false;
Font = new System.Drawing.Font("Microsoft Yahei UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134);
FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
Name = "Form";
StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
Resize += new System.EventHandler(Form_Resize);
ResumeLayout(false);
NotifyIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(NotifyIconMain_MouseClick);
}
private System.Drawing.Color captionColor = System.Drawing.Color.WhiteSmoke;
[System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("标题栏的背景色。")]
public System.Drawing.Color CaptionColor
{
get => captionColor;
set
{
captionColor = value;
Invalidate();
}
}
private bool showCaption = true;
[System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("是否显示窗体标题栏及其控件。"), System.ComponentModel.DefaultValue(true)]
public bool ShowCaption
{
get => showCaption;
set
{
showCaption = value;
Invalidate();
}
}
private int captionHeight = 50;
[System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("标题栏的高度。"), System.ComponentModel.DefaultValue(50)]
public int CaptionHeight
{
get => captionHeight;
set
{
captionHeight = value;
Invalidate();
}
}
private bool showCaptionLine = false;
[System.ComponentModel.Category("Appearance"), System.ComponentModel.Description("是否显示标题栏与客户区的分界线。"), System.ComponentModel.DefaultValue(false)]
public bool ShowCaptionLine
{
get => showCaptionLine;
set
{
showCaptionLine = value;
Invalidate();
}
}
private bool maximizeBox = true;
[System.ComponentModel.Category("WindowStyle"), System.ComponentModel.Description("确定窗体标题栏的右上角是否有最大化框。"), System.ComponentModel.DefaultValue(true)]
public new bool MaximizeBox
{
get => maximizeBox;
set
{
maximizeBox = value;
Invalidate();
}
}
private bool minimizeBox = true;
[System.ComponentModel.Category("WindowStyle"), System.ComponentModel.Description("确定窗体标题栏的右上角是否有最小化框。"), System.ComponentModel.DefaultValue(true)]
public new bool MinimizeBox
{
get => minimizeBox;
set
{
minimizeBox = value;
Invalidate();
}
}
/// <summary>
/// 关闭窗体时执行的操作
/// </summary>
public enum CloseModes
{
/// <summary>
/// 退出程序
/// </summary>
Exit,
/// <summary>
/// 隐藏到通知栏
/// </summary>
HideToNotify
}
[System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("关闭窗体时执行的操作。Exit退出程序,HideToNotify隐藏到通知栏。")]
public CloseModes CloseMode { get; set; } = CloseModes.Exit;
/// <summary>
/// 窗体最大化模式
/// </summary>
public enum MaximumSizeModes
{
/// <summary>
/// 默认
/// </summary>
Default,
/// <summary>
/// 覆盖任务栏
/// </summary>
CoverTaskbar,
/// <summary>
/// 不覆盖任务栏
/// </summary>
UnCoverTaskbar
}
private MaximumSizeModes maximumSizeMode = MaximumSizeModes.Default;
[System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("最大化模式。")]
public MaximumSizeModes MaximumSizeMode
{
get => maximumSizeMode;
set
{
maximumSizeMode = value;
MaximumSizeModeChanged();
}
}
private System.Drawing.Icon notifyIcon = null;
[System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("当程序需要在通知栏显示图标时,通知栏显示的图标。")]
public System.Drawing.Icon NotifyIcon
{
get => notifyIcon ?? Icon;
set => NotifyIconMain.Icon = notifyIcon = value;
}
private System.Windows.Forms.ContextMenuStrip notifyMenuStrip = null;
[System.ComponentModel.Category("Behavior"), System.ComponentModel.Description("当程序需要在通知栏显示图标时,鼠标右键点击通知栏图标后显示的菜单项。")]
public System.Windows.Forms.ContextMenuStrip NotifyMenuStrip
{