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个就会闪····应该还是得做分页·····好麻烦···

时间: 2024-09-29 18:48:31

C#画个控件,指定字符特殊颜色显示的相关文章

Shape画圆形控件

这里涉及到shape的运用,这仅仅是一个实例 circle.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- outer circle --> <item> <shape android:shape=&q

C#:使用快捷菜单(ContextMenuStrip)删除DataGridView控件指定行

工作中遇到一个场景:在DataGridView上单击鼠标右键弹出快捷菜单,在快捷菜单内需要有"删除本行"."清空数据"等按钮,于是我就自己实现了一个: 实现步骤如下: 步骤1,建立一个C#下的Windows窗体应用程序,取名DgvMenuStripTest 步骤2,主窗体内的控件只有一个名为dgvTest的DataGridView,对这个DataGridView启用添加.启用编辑.启用删除,并设置其在父容器中停靠 步骤3,为这个DataGridView添加Mouse

ALV SPLITTER 分割器 需要在屏幕上画个控件

1 *&---------------------------------------------------------------------* 2 *& Report ZTEST4 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------

Jquery设置select控件指定text的值为选中项

<select name="streetid" id="streetid"> <option value="4">北环路</option> <option value="5">天河路</option> <option value="6">清华园路</option> <option value="7"

Delphi 7学习开发控件(继承TGraphicControl只画一条线)

我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假设我们要开发一个画直线的控件,那么我们从下面开始做:1.菜单栏→Component→New Component,在弹出的对话框中按照提示添加: Ancestor type 父类:TGraphicControl  [Controls]Class Name 类名:TLineToPalette Page

强制IE浏览器或WebBrowser控件使用指定版本显示网页

强制IE浏览器或WebBrowser控件使用指定版本显示网页 自从装了IE10之后,就发现好些个网站显示都不是那么的正常,网站上有些功能竟然还会出现一些意想不到的BUG——本来就是针对IE开发的,现在IE下竟然用不起来了,让用户情何以堪?但是就为少量用户使用的系统去大动干戈的调整功能,这实在是让人头疼!在经过一番折腾之后,竟然找到一个非常M$的方法来解决 —— 强制高版本的IE浏览器用低地版本模式显示网页. 就是直接让IE10默认以指定的IE版本的浏览器模式来运行,并用这个指定的版本来进行解析页

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

vcl控件经常使用属性和方法

TTabControl属性 DisplayRect:仅仅定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化.假设为True,是字会变成蓝色Images:为每一个页标签加入一个图片MultiLine:假设总页标签的长度大于该控件的宽度时,是否同意多行显示MultiSelect:是否同意多选页标签.该属性仅仅有当Style为tsFlatButtons或tsButtons时才有效OwnerDraw:是否同意自己绘画该控件RaggedRight:指定是否同意标签页伸展到

转:Tab Control控件的详细使用

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl.    3. 在对话框的初始化函数OnInitDia