實現方式:WinForm自定義控制項,繼承系統Label控制項實現。 第1步:創建“組件”,取名為:MarkLabel 第2步:修改添加如下代碼: /* 添加命名空間引用: * using System.Windows.Forms; * using System.Drawing; * */ public ...
實現方式: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(); }
然後,設計窗體界面,並添加如下代碼即可。
=》
完成!