C#画个控件,指定字符特殊颜色显示

Posted 季末的寂寞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#画个控件,指定字符特殊颜色显示相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExerciseUIPrj.controls
{
    public partial class CustomControl1 : Control
    {

        Rectangle picRec = new Rectangle();
        Rectangle NameRec = new Rectangle();
        Rectangle DirRec = new Rectangle();
        Rectangle BtnRec = new Rectangle();
        Rectangle BtnRec1 = new Rectangle();
        Rectangle TimeRec = new Rectangle();
        Rectangle SizeRec = new Rectangle();

        public CustomControl1()
        {
            InitializeComponent();
            BackColor = Color.White;
        }
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            Size txtSize = TextRenderer.MeasureText("abc", Font);
            int pwid = txtSize.Height * 2 + 10;
            int y =(int) ((Height - pwid) / 2.0);
            Point p = new Point(5, y);
            picRec = new Rectangle(p, new Size(pwid, pwid));
            int txtwid = (int)(Width / 2.0);
            NameRec = new Rectangle(new Point(p.X+picRec.Width + 2, p.Y), new Size(txtwid, txtSize.Height));
            DirRec = new Rectangle(new Point(p.X + picRec.Width +2, p.Y+txtSize.Height+5), new Size(txtwid, txtSize.Height));
            BtnRec = new Rectangle(new Point(NameRec.Location.X + NameRec.Width + 2, NameRec.Y + (int)(txtSize.Height/2.0)), new Size(txtSize.Height,txtSize.Height));
            BtnRec1 = new Rectangle(new Point(NameRec.Location.X + DirRec.Width + 2+txtSize.Width+2, NameRec.Y + (int)(txtSize.Height / 2.0)), new Size(txtSize.Height, txtSize.Height));
            TimeRec = new Rectangle(new Point(BtnRec1.Location.X + txtSize.Width + 4, NameRec.Y), new Size(Width-picRec.Width-NameRec.Width-BtnRec.Width*2-2*4, txtSize.Height));
            SizeRec = new Rectangle(new Point(BtnRec1.Location.X + txtSize.Width + 4, NameRec.Y+txtSize.Height+2), new Size(Width - picRec.Width - NameRec.Width - BtnRec.Width * 2 - 2 * 4, txtSize.Height));
            

        }

        protected override void OnPaint(PaintEventArgs pe)
        {

            var g = pe.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.FillRectangle(Brushes.Red, picRec);//图标

            var t1 = "这是一句测试文档";
            var t2 = "这是一句测试文档这是一句测试文档这是一句测试文档这是一句测试文档这是一句测试文档这是一句测试文档这是一句测试文档这是一句测试文档";
            DrawTxt(t1, g, NameRec, "");
            DrawTxt(t2, g, DirRec, "");
            g.FillRectangle(Brushes.Green, BtnRec);
            g.FillRectangle(Brushes.Blue, BtnRec1);
            var t3 = string.Format("修改时间:{0}",DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
            var t4 = "文件大小:4555KB";
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;
            sf.LineAlignment = StringAlignment.Near;
            g.DrawString(t3, Font, Brushes.Black, TimeRec,sf);
            g.DrawString(t4, Font, Brushes.Black, SizeRec,sf);

            base.OnPaint(pe);

        }
        void DrawTxt(string s, Graphics g, Rectangle rect,string key)
        {
            string[] ress = s.Split(key.ToCharArray());

            List<string> res = new List<string>();
            if (s.StartsWith(key))
                res.Add(key);
            if (ress.Length > 1)
            {
                foreach (var r in ress)
                {
                    if (string.IsNullOrEmpty(r))
                        continue;
                    res.Add(r);
                    res.Add(key);
                }
                if (!s.EndsWith(key))
                    res.RemoveAt(res.Count - 1);
            }
            else
            {
                res.Add(s);
            }

            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;
            sf.LineAlignment = StringAlignment.Near;
            sf.Trimming = StringTrimming.EllipsisCharacter;
            
            int cwid = 0;
            for (int i = 0; i < res.Count; i++)
            {
                int wid = TextRenderer.MeasureText(g, res[i], Font,new Size(),TextFormatFlags.NoPadding|TextFormatFlags.NoPrefix).Width;
                Brush b = res[i] == key ? Brushes.Red : Brushes.Black;
                int x = cwid+wid;
                if(x>=rect.Width)
                {
                    wid = rect.Width - cwid;
                    RectangleF rec = new RectangleF(new PointF(rect.Location.X+cwid,rect.Y), new SizeF(wid, rect.Height));
                    g.DrawString(res[i], Font, b, rec, sf);
                    break;
                }
                else
                {
                    g.DrawString(res[i], Font, b, new Point(rect.Location.X + cwid, rect.Y), sf);
                }
                cwid += wid;

            }
        }
    }
}

用自带的控件堆出来的用户控件放在flowlayotpanel里边多了滚动的时候闪的厉害·,这里就用自己画一个··顺便解决特殊字符不同颜色显示的问题··这个堆多了好像也会闪烁···在panel里边堆200个就会闪····应该还是得做分页·····好麻烦···

以上是关于C#画个控件,指定字符特殊颜色显示的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用C#的RichTextBox控件

C# 选中 DataGridView 控件中的行时显示不同的颜色

在 xml 中保留特殊字符

在C#的RichTextBox中如何使特定文字显示颜色

C# 公共控件之richTextBox

WPF中如何通过C#代码改变控件Backgroung的颜色