【原创】重绘winform的GroupBox

功能:重绘winform的GroupBox,以便调整边框颜色和边框宽度
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace JSHYSC_CtrlLib
{
    public partial class Ctrl_GroupBox : GroupBox
    {
        private Color borderLineColor =System.Drawing.SystemColors.GradientActiveCaption;
        /// <summary>
        /// 边框线颜色
        /// </summary>
        public Color BorderLineColor
        {
            get { return borderLineColor; }
            set { borderLineColor = value; }
        }

        private float borderLineWidth = 1;
        /// <summary>
        /// 边框线宽度
        /// </summary>
        public float BorderLineWidth
        {
            get { return borderLineWidth; }
            set { borderLineWidth = value; }
        }

        public Ctrl_GroupBox()
        {
            InitializeComponent();
        }

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

            e.Graphics.Clear(base.BackColor);

            //圆弧直径长度
            int radius = 20;
            int width = e.ClipRectangle.Width, height = e.ClipRectangle.Height;
            int titleStartX = 15;
            float titleWidth = e.Graphics.MeasureString(base.Text, base.Font).Width;
            float titleHeight = e.Graphics.MeasureString(base.Text, base.Font).Height;

            Pen pen = new Pen(borderLineColor, (float)borderLineWidth);

            //左上角圆弧
            e.Graphics.DrawArc(pen, new Rectangle(0, (int)(titleHeight / 2), radius, radius), 180, 90);

            //上边框,标题前半部分
            e.Graphics.DrawLine(pen, radius / 2, (titleHeight - 1) / 2, radius + titleStartX-3, (titleHeight - 1) / 2);

            //画笔
            SolidBrush brush = new SolidBrush(Color.Black);
            Font font = new System.Drawing.Font("宋体", 10, FontStyle.Bold);
            //标题
            e.Graphics.DrawString(base.Text, font, brush, radius / 2 + titleStartX, 0);

            //上边框,标题右半部分
            e.Graphics.DrawLine(pen, radius / 2 + titleStartX + titleWidth+3, (titleHeight - 1) / 2, (width - 1) - radius / 2, (titleHeight - 1) / 2);

            //右上角圆弧
            e.Graphics.DrawArc(pen, new Rectangle((width - 1) - radius, (int)(titleHeight / 2), radius, radius), 270, 90);

            //右边框
            e.Graphics.DrawLine(pen, width - 1, (int)(titleHeight / 2) + radius / 2, width - 1, (height - 1) - radius / 2);

            //右下角圆弧
            e.Graphics.DrawArc(pen, new Rectangle((width - 1) - radius, (height - 1) - radius, radius, radius), 0, 90);

            //下边框
            e.Graphics.DrawLine(pen, (width - 1) - radius / 2, height - 1, radius / 2, height - 1);

            //左下角圆弧
            e.Graphics.DrawArc(pen, new Rectangle(0, (height - 1) - radius, radius, radius), 90, 90);

            //左边框
            e.Graphics.DrawLine(pen, 0, (height - 1) - radius / 2, 0, (int)(titleHeight / 2) + radius / 2);
        }
    }
}

  

 
时间: 2024-10-27 12:32:19

【原创】重绘winform的GroupBox的相关文章

WinForm中重绘TabControl选项卡标题

最近开发WinForm频繁使用了TabControl控件,这个控件的选项卡没有BackgroundImage这个属性,那么如何为其各个选项卡添加背景图片呢?(这里说的是每个TabPage的头部,也就是标题,不是工作区域.) 最开始用到TabControl的时候,我的每个选项卡是写死的,而后由于项目需求又动态添加了TabControl并生成各个选项卡,而两次我都要重绘其标题,因此在这里把我当时两种情形下重绘的方法通过一个例子一起分享出来. 首先先在窗体拖个Tabcontrol控件,然后更改了其Al

winform重绘窗体成圆角(网上借鉴)

winform做圆角窗体: 1 //重绘窗体为圆角 2 private void frmMain_Paint(object sender, PaintEventArgs e) 3 { 4 #region 5 6 List<Point> list = new List<Point>(); 7 int width = this.Width; 8 int height = this.Height; 9 10 #region 四个圆角 11 12 //左上 13 list.Add(new

[DForm]我也来做自定义Winform之另类标题栏重绘

据说得有楔子 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧).                   还要来个序 其实,很多年没写过Winform了,前端时间在重构我们公司自己的呼叫中心系统,突然就觉得客户端好丑好丑,对于我这种强迫症晚期患者来说,界面不好看都不知道怎么写代码的,简直就是种折磨,还是满清十大酷刑级别那种. 很多人推荐WPF,不过个人对WPF没啥感觉,而且据说也无法支持2.0,还是采用Winform技术来搞吧. 终于第一节 做Winform皮

winform重绘

1.重绘文字#多行文字a.先定义一个矩形 Rectangle p1 = new Rectangle(10, 0, 200, this.Height); Rectangle p2 = new Rectangle(210, 0, 200, this.Height); Rectangle p3 = new Rectangle(410, 0, 100, this.Height); b.在矩形中写入文字 TextRenderer.DrawText(g,name,Font,p1,ForeColor,Text

自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)

CSDN的Blog开通了.我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢. 因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢. Q: http://community.csdn.net/Expert/TopicView.asp?id=3106090 言归正传,要实现一些标准的容器类控件的透明效果,也许是个经常会想到的问题.事实上在2000以上的系统下实现起来相当容易. 你不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT的属性可

WinForm中按钮等控件的背景渐变色重绘

注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. 1 private void PaintGradientBackground(Button btn) 2 { 3 Bitmap newGradientBackImg = new Bitmap(btn.Width, btn.Height); 4 LinearGradientBrush brush = new LinearGradientBrush(new PointF(0, 0), n

重写OnPaint事件对窗体重绘(显示gif动画) 实例2

/// <summary> /// 可显示Gif 的窗体 /// </summary> public class WinGif : Form { private Image _img = null; public Image Img { get { return _img; } set { _img = value; } } private EventHandler evtHandler = null; public WinGif(Image img) { //初始化设置 evtH

深入Windows窗体原理及控件重绘技巧

之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望这篇文章可以帮你解惑. 1.Windows窗体原理 首先,如果看过Win32 SDK编程的都知道Windows的三大核心系统:负责窗口对象产生和消息分发的USER模块,负责图像显示绘制的GDI模块,负责内存.进程.IO管理的KERNEL模块.试想象一下如何在一个像素阵列上产生窗口对象,其实就是使用G

减少页面回流与重绘(Reflow &amp; Repaint)

如果你的HTML变得很大很复杂,那么影响你JavaScript性能的可能并不是JavaScript代码的复杂度,而是页面的回流和重绘. 回流(Reflow)是指布局引擎为frame计算图形的过程. frame是一个矩形,拥有宽高和相对父容器的偏移.frame用来显示盒模型(content model), 但一个content model可能会显示为多个frame,比如换行的文本每行都会显示为一个frame. 关于CSS盒模型的介绍请参考:CSS 盒模型及其呈现方式 重绘(Repaint)发生在元