Files
KJD_WebService/TEMUKJD/UserComponent/UcGroupBoxEx.cs
T

116 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TemuKJD.UserComponent
{
/// <summary>
/// 可以改变边框颜色的groupbox
/// </summary>
public partial class UcGroupBoxEx : GroupBox
{
private Color _BorderColor = Color.FromArgb(33, 202, 99);
private GroupBoxBorderStyle _BorderStyle = GroupBoxBorderStyle.ROUND;
[Browsable(true), Description("边框颜色"), Category("自定义分组")]
public Color BorderColor
{
get { return _BorderColor; }
set
{
_BorderColor = value;
this.Invalidate();
}
}
[Browsable(true), Description("边框样式"), Category("自定义分组")]
public GroupBoxBorderStyle BorderStyle
{
get { return _BorderStyle; }
set
{
_BorderStyle = value;
this.Invalidate();
}
}
public UcGroupBoxEx()
{
InitializeComponent();
}
public UcGroupBoxEx(IContainer container)
{
container.Add(this);
InitializeComponent();
}
/// <summary>
/// 重写OnPaint绘制自定义效果
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(this.BackColor);
// 绘制字体
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // 或者 AntiAliasGridFit // 平滑字体
e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), 10, 1);
// 计算文本大小
var vSize = e.Graphics.MeasureString(this.Text, this.Font);
Pen vPen = new Pen(this._BorderColor);
// 绘制矩形
if (_BorderStyle == GroupBoxBorderStyle.SQUARE)
{
e.Graphics.DrawLine(vPen, 2, vSize.Height / 2, 8, vSize.Height / 2); // 标题左侧
e.Graphics.DrawLine(vPen, vSize.Width + 8, vSize.Height / 2, this.Width - 3, vSize.Height / 2); // 标题右侧
e.Graphics.DrawLine(vPen, 2, vSize.Height / 2, 2, this.Height - 3); // 左侧
e.Graphics.DrawLine(vPen, 2, this.Height - 3, this.Width - 3, this.Height - 3); // 底部
e.Graphics.DrawLine(vPen, this.Width - 3, vSize.Height / 2, this.Width - 3, this.Height - 3); // 右侧
}
// 绘制圆角矩形
else
{
e.Graphics.DrawLine(vPen, 4, vSize.Height / 2, 8, vSize.Height / 2); // 标题左侧
e.Graphics.DrawLine(vPen, vSize.Width + 8, vSize.Height / 2, this.Width - 5, vSize.Height / 2); // 标题右侧
e.Graphics.DrawLine(vPen, 2, vSize.Height / 2 + 2, 2, this.Height - 5); // 左侧
e.Graphics.DrawLine(vPen, 4, this.Height - 3, this.Width - 5, this.Height - 3); // 底部
e.Graphics.DrawLine(vPen, this.Width - 3, vSize.Height / 2 + 2, this.Width - 3, this.Height - 5); // 右侧
// 边角直线模拟圆角
e.Graphics.DrawLine(vPen, 2, vSize.Height / 2 + 2, 4, vSize.Height / 2); // 左上角
e.Graphics.DrawLine(vPen, this.Width - 5, vSize.Height / 2, this.Width - 3, vSize.Height / 2 + 2); // 右上角
e.Graphics.DrawLine(vPen, this.Width - 3, this.Height - 5, this.Width - 5, this.Height - 3); // 右下角
e.Graphics.DrawLine(vPen, 4, this.Height - 3, 2, this.Height - 5); // 左下角
}
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
try
{
// WM_NCCALCSIZE 0x0083 当计算某个窗口的客户区大小和位置时发送此消息
// windows消息值表,可参考:http://hi.baidu.com/dooy/blog/item/0e770a24f70e3b2cd407421b.html
if (m.Msg == 0x83)
{
this.Invalidate();
}
}
catch { }
}
public enum GroupBoxBorderStyle
{
ROUND,
SQUARE,
}
}
}