實作方式:WinForm自定義控制元件,繼承系統Label控制元件實作,

第1步:創建“組件”,取名為:MarkLabel

第2步:修改添加如下代碼:
/* 添加命名空間參考: * using System.Windows.Forms; * using System.Drawing; * */ public partial class MarkLabel : Label // 繼承自: System.Windows.Forms.Label { [Browsable(true), Category("CUIT-DX037"), Description("關鍵字標記陣列")] public MarkKey[] KeyWords { get; set; } = new MarkKey[0]; public MarkLabel() { } protected override void OnPaint(PaintEventArgs e) { //base.OnPaint(e); TextRenderer.DrawText(e.Graphics, this.Text, this.Font, new Point(0, 0), this.ForeColor); if (this.Text.Length <= 0) return; // 依次將每一個關鍵字重新覆寫繪制一次 for (int i = 0; i < KeyWords.Length; i++) { string keyWord = KeyWords[i].KeyWord; Color keyColor = KeyWords[i].KeyColor; int keyWidth = TextRenderer.MeasureText(keyWord, this.Font).Width; // 當前關鍵字的測量寬度 int IndexOffset = this.Text.IndexOf(keyWord); // 第一次出現該關鍵字的位置 while (IndexOffset >= 0) { string StrFront = Text.Substring(0, IndexOffset); // 該關鍵字前面的所有字符 if (StrFront.Length > 0) { int strWidth = TextRenderer.MeasureText(StrFront + keyWord, this.Font).Width; // 計算好關鍵字的位置,然后重新覆寫繪制, TextRenderer.DrawText(e.Graphics, keyWord, Font, new Point((strWidth - keyWidth), 0), keyColor); } else { // 使用該關鍵字指定的顏色,重繪該關鍵字 TextRenderer.DrawText(e.Graphics, keyWord, Font, new Point(0, 0), keyColor); } // 判斷條件,然后退出該關鍵字回圈 IndexOffset += keyWord.Length; if (IndexOffset >= Text.Length) break; // 提取關鍵字后面的所有字符 string StrBehind = Text.Substring(IndexOffset); if (StrBehind.Length <= 0) break; int index2 = StrBehind.IndexOf(keyWord); if (index2 < 0) break; IndexOffset += index2; // 當前關鍵字,下一個位置 } } // 遍歷訪問每一個關鍵字 } } public class MarkKey { /// <summary> /// 關鍵字-字串 /// </summary> public string KeyWord { get; set; } /// <summary> /// 關鍵字凸顯顏色 /// </summary> public Color KeyColor { get; set; } = Color.Red; }
然后,編譯生成,
第3步:使用,在表單界面上,添加該控制元件,然后設定它的屬性,

以后,在修改該控制元件的Text屬性時,將會自動重繪顯示效果,

提高一下:給控制元件再添加幾個方法:
/// <summary> /// 指定一個關鍵字,以默認(紅色)標記 /// </summary> public void ResetKeyWord(string keyString) { ResetKeyWord(keyString, Color.Red); } /// <summary> /// 指定一個關鍵字,以指定顏色標記 /// </summary> public void ResetKeyWord(string keyString, Color keyColor) { this.KeyWords = new MarkKey[] { new MarkKey() { KeyWord = keyString, KeyColor = keyColor } }; this.Refresh(); } /// <summary> /// 指定多個關鍵字,以默認(紅色)標記 /// </summary> /// <param name="keyStringList"></param> public void ResetKeyWord(params string[] keyStringList) { var query = from str in keyStringList select new MarkKey() { KeyWord = str, KeyColor = Color.Red }; this.KeyWords = query.ToArray(); this.Refresh(); }
然后,設計表單界面,并添加如下代碼即可,
=》
完成!
您的支持,是我分享的動力!感謝支持!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/68961.html
標籤:C#
上一篇:C# 獲取鍵盤鉤子,屏蔽鍵盤按鍵
