WinForm真入門(9)——RichTextBox控件詳解

WinForm中RichTextBox控件詳解:從基礎到高級應用

上一文中筆者重點介紹了TextBox控件的詳細用法,忘記的 請點擊WinForm真入門(8)——TextBox控件詳解,那么本文中的RichTextBox與TextBox有什么區別嗎,光看名字的話,多了一個“Rich 富有的意思”,是不是暗示著它支持的功能更多呢?沒錯,RichTextBox是WinForm中功能強大的富文本編輯控件,支持字體、顏色、段落格式、圖像嵌入、超鏈接等復雜功能。以下從基礎到高級功能全面解析,并提供多個實用案例。


一、基礎屬性與核心功能?

?1、基礎屬性?

  • Text?:獲取或設置純文本內容。
richTextBox1.Text = "Hello World";
  • ?Rtf?:獲取或設置帶格式的RTF內容。
richTextBox1.Rtf = @"{\rtf1\ansi 這是\b 加粗\b0 的文本}";
  • ?SelectionFont?:設置選中文本的字體樣式。
richTextBox1.SelectionFont = new Font("Arial", 12, FontStyle.Bold);
  • ?SelectionColor?:設置選中文本的顏色。
richTextBox1.SelectionColor = Color.Red;
  • ?SelectionAlignment?:設置段落對齊方式(左對齊、居中、右對齊)。
richTextBox1.SelectionAlignment = HorizontalAlignment.Center;

2?、常用方法?

  • ?AppendText?:追加文本(保留當前格式)。
richTextBox1.AppendText("\n新的一行");
  • ?LoadFile/SaveFile?:加載或保存RTF文件。
richTextBox1.LoadFile("document.rtf");
richTextBox1.SaveFile("document.rtf", RichTextBoxStreamType.RichText);
  • ?Find?:查找文本。
int index = richTextBox1.Find("關鍵字");
if (index >= 0) richTextBox1.Select(index, "關鍵字".Length);

3?、關鍵事件?

  • ?TextChanged?:文本內容變化時觸發。
private void richTextBox1_TextChanged(object sender, EventArgs e) { }
  • ?SelectionChanged?:選中文本范圍變化時觸發。
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{label1.Text = $"當前選中:{richTextBox1.SelectionLength}字符";
}

?二、高級功能與案例?

?案例1:實現富文本編輯器?

// 字體選擇
private void btnFont_Click(object sender, EventArgs e)
{FontDialog fontDialog = new FontDialog();if (fontDialog.ShowDialog() == DialogResult.OK){richTextBox1.SelectionFont = fontDialog.Font;}
}// 顏色選擇
private void btnColor_Click(object sender, EventArgs e)
{ColorDialog colorDialog = new ColorDialog();if (colorDialog.ShowDialog() == DialogResult.OK){richTextBox1.SelectionColor = colorDialog.Color;}
}// 插入圖片(通過剪貼板)
private void btnInsertImage_Click(object sender, EventArgs e)
{OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = "圖片文件|*.jpg;*.png;*.bmp";if (openFile.ShowDialog() == DialogResult.OK){Clipboard.SetImage(Image.FromFile(openFile.FileName));richTextBox1.Paste();}
}

?案例2:動態設置段落縮進與項目符號?

// 增加縮進
private void btnIndent_Click(object sender, EventArgs e)
{richTextBox1.SelectionIndent += 20;
}// 添加項目符號
private void btnBullet_Click(object sender, EventArgs e)
{richTextBox1.SelectionBullet = true;richTextBox1.AppendText("項目1\n項目2\n");
}

?案例3:實現超鏈接與點擊事件?

// 插入超鏈接
private void InsertHyperlink(string text, string url)
{richTextBox1.SelectionColor = Color.Blue;richTextBox1.SelectionFont = new Font("Arial", 10, FontStyle.Underline);richTextBox1.AppendText(text);richTextBox1.SelectionStart = richTextBox1.Text.Length - text.Length;richTextBox1.SelectionLength = text.Length;richTextBox1.SelectionLink = true;// 存儲URL到TagrichTextBox1.Tag = url;
}// 處理超鏈接點擊
private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{System.Diagnostics.Process.Start(e.LinkText);
}

?案例4:日志顯示(不同顏色區分信息類型)?

public void LogMessage(string message, LogLevel level)
{Color color = Color.Black;switch (level){case LogLevel.Info: color = Color.Blue; break;case LogLevel.Warn: color = Color.Orange; break;case LogLevel.Error: color = Color.Red; break;}richTextBox1.SelectionColor = color;richTextBox1.AppendText($"{DateTime.Now}: {message}\n");richTextBox1.ScrollToCaret(); // 自動滾動到底部
}

?案例5:實現撤銷(Undo)與重做(Redo)?

private void btnUndo_Click(object sender, EventArgs e)
{if (richTextBox1.CanUndo){richTextBox1.Undo();richTextBox1.ClearUndo(); // 防止重復撤銷}
}private void btnRedo_Click(object sender, EventArgs e)
{// 需自行維護重做棧(RichTextBox無原生Redo方法)// 可通過繼承控件或記錄操作歷史實現
}

?三、性能優化與高級技巧?

1?、大量文本處理優化?

  • 掛起繪制?:在批量操作時暫停繪制以提升性能。
SendMessage(richTextBox1.Handle, WM_SETREDRAW, false, 0);
// 執行批量文本操作...
SendMessage(richTextBox1.Handle, WM_SETREDRAW, true, 0);
richTextBox1.Invalidate();

2?、防閃爍處理?

  • ?自定義控件啟用雙緩沖?:
public class NoFlickerRichTextBox : RichTextBox
{public NoFlickerRichTextBox(){SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);}
}

3?、異步加載內容?

  • 使用Task避免界面卡頓:
private async void LoadLargeFile(string path)
{string rtfContent = await Task.Run(() => File.ReadAllText(path));richTextBox1.Rtf = rtfContent;
}

?四、與其他控件交互?

?案例6:與TreeView聯動實現大綱視圖?

// 根據標題生成目錄
private void GenerateOutline()
{treeView1.Nodes.Clear();foreach (string line in richTextBox1.Lines){if (line.StartsWith("# ")){TreeNode node = new TreeNode(line.Substring(2));treeView1.Nodes.Add(node);}}
}// 點擊目錄跳轉到對應位置
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{int index = richTextBox1.Find(e.Node.Text);if (index != -1){richTextBox1.SelectionStart = index;richTextBox1.ScrollToCaret();}
}

?案例7:與WebBrowser控件協同顯示HTML?

// 將RTF轉換為HTML顯示(需第三方庫如PanGu.RTF)
private void btnPreviewHtml_Click(object sender, EventArgs e)
{string html = ConvertRtfToHtml(richTextBox1.Rtf);webBrowser1.DocumentText = html;
}

?五、數據持久化與擴展?

1?、保存與加載格式?

  • RTF格式?:保留所有樣式。
richTextBox1.SaveFile("doc.rtf", RichTextBoxStreamType.RichText);
  • ?純文本格式?:僅保留文本內容。
File.WriteAllText("doc.txt", richTextBox1.Text);

2?、擴展:實現Markdown編輯器?

  • 使用正則表達式轉換Markdown與RTF:
// 轉換加粗語法:‌**text**‌ → \b text\b0
string rtf = Regex.Replace(markdown, @"\*\*(.*?)\*\*", @"\b $1\b0");

?六、常見問題與解決方案?

?1、圖片顯示不全?

  • 原因:圖片過大導致布局溢出。
  • 解決:縮放圖片至合適尺寸后再插入。
Image img = Image.FromFile("large.jpg");
Bitmap resized = new Bitmap(img, new Size(200, 200));
Clipboard.SetImage(resized);
richTextBox1.Paste();

2?、跨平臺格式兼容性?

  • 問題:在不同系統上RTF渲染不一致。
  • 解決:盡量使用通用字體(如Arial、Times New Roman)。

3?、超鏈接無法點擊?

  • 檢查:確保DetectUrls屬性為true,并處理LinkClicked事件。
richTextBox1.DetectUrls = true;

七、使用建議

1?、核心場景?:

  • 需要富文本編輯(如郵件客戶端、文檔編輯器)。
  • 動態顯示格式化的日志或聊天記錄。
  • 復雜報表的內容生成與預覽。

2?、避坑指南?:

  • 避免直接操作Rtf屬性拼接復雜格式,優先使用SelectionXXX方法。
  • 處理大量文本時,務必使用掛起繪制技術提升性能。
  • 謹慎使用剪貼板操作,需處理權限和異常。

通過靈活運用RichTextBox的豐富功能,結合WinForm的事件驅動模型,可構建高度定制化的富文本處理應用。功能比較多,如果是初學者,可以先了解一下,會使用即可。如果對你有所幫助的話,歡迎點贊,收藏,加關注,以防后期找不到!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75764.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Draw.io 全面解析與競品分析:圖表繪制工具的深度對比

目錄 一、Draw.io 全面介紹 1. 產品概述 2. 核心功能特點 3. 用戶體驗 4. 商業模式 二、市場競品分析 1. 主要競品概覽 2. 深度功能對比 3. 價格策略對比 4. 技術架構對比 三、用戶場景與選擇建議 1. 不同場景下的工具推薦 2. 未來發展趨勢 四、結論 diagrams.net…

kafka分區策略詳解

Kafka 分區策略詳解 Kafka 的分區策略決定了消息在生產者端如何分配到不同分區,以及在消費者端如何動態分配分區以實現負載均衡。以下是 Kafka 核心分區策略及其適用場景的詳細解析: 1、生產者分區策略 生產者負責將消息發送到 Topic 的特定分區&#…

C++ STL 詳解 ——list 的深度解析與實踐指南

在 C 的標準模板庫(STL)中,list作為一種重要的序列式容器,以其獨特的雙向鏈表結構和豐富的操作功能,在許多編程場景下發揮著關鍵作用。深入理解list的特性與使用方法,能幫助開發者編寫出更高效、靈活的代碼…

GenerationMixin概述

類 類名簡單說明GenerateDecoderOnlyOutput繼承自 ModelOutput,適用于非束搜索方法的解碼器-only模型輸出類。GenerateEncoderDecoderOutput繼承自 ModelOutput,適用于非束搜索方法的編碼器-解碼器模型輸出類。GenerateBeamDecoderOnlyOutput繼承自 Mod…

【備賽】藍橋杯嵌入式實現led閃爍

原理 由于藍橋杯的板子帶有鎖存器,并且與lcd屏幕有沖突,所以這個就成了考點。 主要就是用定時器來實現,同時也要兼顧lcd的沖突。 一、處理LCD函數 首先來解決與lcd屏幕沖突的問題,把我們所有用到的lcd函數改裝一下。 以下是基…

C++ 并發性能優化實戰:提升多線程應用的效率與穩定性

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,獲得2024年博客之星榮譽證書,高級開發工程師,數學專業,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開發技術&#xff0c…

Python----計算機視覺處理(Opencv:道路檢測之車道線擬合)

完整版: Python----計算機視覺處理(Opencv:道路檢測完整版:透視變換,提取車道線,車道線擬合,車道線顯示) 一、獲取左右車道線的原始位置 導入模塊 import cv2 import numpy as np from matplot…

優選算法的妙思之流:分治——歸并專題

專欄:算法的魔法世界 個人主頁:手握風云 目錄 一、歸并排序 二、例題講解 2.1. 排序數組 2.2. 交易逆序對的總數 2.3. 計算右側小于當前元素的個數 2.4. 翻轉對 一、歸并排序 歸并排序也是采用了分治的思想,將數組劃分為多個長度為1的子…

C語言查漏補缺:基礎篇

1.原理 C語言是一門編譯型計算機語言,要編寫C代碼,C源代碼文本文件本身無法直接執行,必須通過編譯器翻譯和鏈接器的鏈接,生成二進制的可執行文件,然后才能執行。這里的二進制的可執行文件就是我們最終要形成的可執行程…

TPS入門DAY02 服務器篇

1.創建空白插件 2.導入在線子系統以及在線steam子系統庫 MultiplayerSessions.uplugin MultiplayerSessions.Build.cs 3.創建游戲實例以及初始化會話創建流程 創建會話需要的函數,委托,委托綁定的回調,在線子系統接口綁定某一個委托的控制其…

產品經理課程

原型工具 一、土耳其機器人 這個說法來源于 1770 年出現的一個騙局,一個叫沃爾夫岡馮肯佩倫(Wolfgang von Kempelen)的人為了取悅奧地利女皇瑪麗婭特蕾莎(Maria Theresia),“制造”了一個會下國際象棋的機…

nginx中的limit_req 和 limit_conn

在 Nginx 中,limit_req 和 limit_conn 是兩個用于限制客戶端請求的指令,它們分別用于限制請求速率和并發連接數。 limit_req limit_req 用于限制請求速率,防止客戶端發送過多請求影響服務器性能。它通過 limit_req_zone 指令定義一個共享內存…

基于winform的串口調試助手

目錄 一、串口助手界面設計 1.1 串口配置 1.2 接收配置 1.3 發送配置 1.4 接收窗口和發送窗口 1.5 狀態顯示窗口 1.6 串口通訊控件 二、程序編寫 2.1 端口號自動識別并顯示在端口號下拉框 功能說明: 2.2 波特率下拉框顯示 2.3 數據位下拉框顯示 2.4 校…

Docker基礎2

如需轉載,標記出處 本次我們將下載一個 Docker 鏡像,從鏡像中啟動容器 上一章,安裝 Docker 時,獲得兩個主要組件: Docker 客戶端 Docker 守護進程(有時稱為“服務器”或“引擎”) 守護進程實…

Rocketmq2

一、生產者端防丟失 1. 發送方式選擇 同步發送:使用 send() 方法,等待 Broker 確認響應(SendResult),確保消息已成功發送。異步發送:使用 sendAsync() 方法并設置回調函數,處理發送成功 / 失敗…

RabbitMQ詳解,RabbitMQ是什么?架構是怎樣的?

目錄 一,RabbitMQ是什么? 二,RabbitMQ架構 2.1 首先我們來看下RabbitMQ里面的心概念Queue是什么? 2.2 交換器Exchange 2.3 RabbitMQ是什么? 2.4 重點看下優先級隊列是什么? 三,RabbitMQ集群 3.1 普通集群模式 3.2 鏡像隊列集群 一,RabbitMQ是什么? 假設我們程序…

【一步步開發AI運動APP】六、運動計時計數能調用

之前我們為您分享了【一步步開發AI運動小程序】開發系列博文,通過該系列博文,很多開發者開發出了很多精美的AI健身、線上運動賽事、AI學生體測、美體、康復鍛煉等應用場景的AI運動小程序;為了幫助開發者繼續深耕AI運動領域市場,今…

MySQL——DQL的多表查詢

一、交叉連接 標準語法:select * from 表1 cross join 表2 where 表1.公共列 表2.公共列; 簡單語法:select * from 表1 , 表2 where 表1.公共列 表2.公共列; 公共列:兩張表具有相同含義的列,不是列名一樣。 …

【Linux內核】如何更加優雅閱讀Linux內核源碼(vscode)

1. 前言 因為已經習慣在Ubuntu下進行嵌入式工作開發,但Linux源碼在Source Insight下進行閱讀,一直很苦惱Linux/Windows來回切換的開發方式,當前發現可以通過 vscode clangd(擴展組件) 方式進行更好的內核源碼閱讀。 2. 環境 操作系統&…

21.OpenCV獲取圖像輪廓信息

OpenCV獲取圖像輪廓信息 在計算機視覺領域,識別和分析圖像中的對象形狀是一項基本任務。OpenCV 庫提供了一個強大的工具——輪廓檢測(Contour Detection),它能夠幫助我們精確地定位對象的邊界。這篇博文將帶你入門 OpenCV 的輪廓…