做一個文本編輯控件,設定字型的格式等功能必不可少。 RichTextBox作為.Net提供的富文本控件,成為很多人做文本編輯器的首選。本文将要讨論就是針對RichTextBox控件的設定粗體、斜 體、下劃線等功能的相關問題。
首先我們看一段設定體的代碼。
<code>//設定粗體 </code>
<code> </code><code>private</code> <code>void</code> <code>toolStripButton4_Click(</code><code>object</code> <code>sender, EventArgs e) </code>
<code> </code><code>{ </code>
<code> </code><code>Font oldFont, newFont; </code>
<code> </code><code>oldFont = curRichTextBox.SelectionFont; </code>
<code> </code><code>if</code> <code>(oldFont.Bold) </code>
<code> </code><code>{ </code>
<code> </code><code>newFont =</code><code>new</code> <code>Font(oldFont, oldFont.Style ^ FontStyle.Bold); </code>
<code> </code><code>} </code>
<code> </code><code>else</code>
<code> </code><code>newFont =</code><code>new</code> <code>Font(oldFont, oldFont.Style | FontStyle.Bold); </code>
<code> </code><code>curRichTextBox.SelectionFont = newFont; </code>
<code> </code><code>curRichTextBox.Focus(); </code>
<code> </code><code>} </code>
乍一看上面的代碼沒什麼問題,首先擷取被選中文本的Font對象,然後判斷是否為粗體,如果是,就将粗體取消;如果不是,則将被選中文本設為粗體。寫幾個字母并選中,點選 B 按鈕,文字加粗;再點選,文字去粗。好像真的沒什麼問題。那如果我選中的字型中既有漢字又有英文,或者字型的FontName不同時,會有問題嗎?試一下,結果出異常了。
為什麼呢?因為我們選中的文本格式不同一,它們的Font不一樣,當它們被選中時,我們獲得的SelectionFont就是null了,是以這裡會出現 空指針異常。該怎麼辦呢?我們可以在使用前先判斷一下oldFont是否為空。如果為空,我們再做單獨處理。
在被選中文本的SelectionFont為空的情況下,我們該怎樣設定被選中文本的格式是一個很重要的問題。雖然整體的SelectionFont為 空,但是,如果我們化整為零,隻選中一個文字,那麼它的Font肯定不為空,而設定它的FontStyle也 就很簡單了。是以,我們得出這樣的政策。
1. 如果隻選中一個文字或者光标沒有選中文字而隻是處于文本框的某一坐标點,這時SelectionFont不為空,可直接加粗或去粗。
2. 如果選中了多個文字并且SelectionFont為空,可以做如下處理,首先擷取被選中文本的ProtoType,即保留被選文字的副本,對其副本進行 操作而不影響它的原型。逐一選中副本中的文字,并一一設定它們的FontStyle。
3. 如果選中了多個文字但是它的SelectionFont不為空,即它們的字型種類相同,能不能直接像第一種情況那樣加粗去粗呢?不能,因為它們的 FontSize和FontStyle可能不相同。這時我們也需要一一處理,是以,情況3類似于情況2的處理方法。
以上是針對Bold的讨論,同樣也适用于Italic和Underline,是以,我們可以寫一個統一的設定FontStyle的方法,方法如下所示。
<code>///<summary> </code>
<code>///設定字型格式:粗體、斜體、下劃線 </code>
<code>///</summary> </code>
<code>/// <param name="style">事件觸發後傳參:字型格式類型</param> </code>
<code> </code><code>private</code> <code>void</code> <code>ChangeFontStyle(FontStyle style) </code>
<code>{ </code>
<code> </code><code>if</code> <code>(style != FontStyle.Bold && style != FontStyle.Italic && </code>
<code> </code><code>style != FontStyle.Underline) </code>
<code> </code><code>throw</code> <code>new</code> <code>System.InvalidProgramException(</code><code>"字型格式錯誤"</code><code>); </code>
<code> </code><code>RichTextBox tempRichTextBox =</code><code>new</code> <code>RichTextBox(); </code><code>//将要存放被選中文本的副本 </code>
<code> </code><code>int</code> <code>curRtbStart = curRichTextBox.SelectionStart; </code>
<code> </code><code>int</code> <code>len = curRichTextBox.SelectionLength; </code>
<code> </code><code>int</code> <code>tempRtbStart = 0; </code>
<code> </code><code>Font font = curRichTextBox.SelectionFont; </code>
<code> </code><code>if</code> <code>(len <= 1 && font !=</code><code>null</code><code>)</code><code>//與上邊的那段代碼類似,功能相同 </code>
<code> </code><code>{ </code>
<code> </code><code>if</code> <code>(style == FontStyle.Bold && font.Bold || </code>
<code> </code><code>style == FontStyle.Italic && font.Italic || </code>
<code> </code><code>style == FontStyle.Underline && font.Underline) </code>
<code> </code><code>{ </code>
<code> </code><code>curRichTextBox.SelectionFont =</code><code>new</code> <code>Font(font, font.Style ^ style); </code>
<code> </code><code>} </code>
<code> </code><code>else</code> <code>if</code> <code>(style == FontStyle.Bold && !font.Bold || </code>
<code> </code><code>style == FontStyle.Italic && !font.Italic || </code>
<code> </code><code>style == FontStyle.Underline && !font.Underline) </code>
<code> </code><code>curRichTextBox.SelectionFont =</code><code>new</code> <code>Font(font, font.Style | style); </code>
<code> </code><code>return</code><code>; </code>
<code> </code><code>} </code>
<code> </code><code>tempRichTextBox.Rtf = curRichTextBox.SelectedRtf; </code>
<code> </code><code>tempRichTextBox.Select(len - 1, 1);</code><code>//選中副本中的最後一個文字 </code>
<code> </code><code>//克隆被選中的文字Font,這個tempFont主要是用來判斷 </code>
<code> </code><code>//最終被選中的文字是否要加粗、去粗、斜體、去斜、下劃線、去下劃線 </code>
<code> </code><code>Font tempFont = (Font)tempRichTextBox.SelectionFont.Clone(); </code>
<code> </code>
<code> </code><code>//清空2和3 </code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i < len; i++) </code>
<code> </code><code>tempRichTextBox.Select(tempRtbStart + i, 1); </code><code>//每次選中一個,逐個進行加粗或去粗 </code>
<code> </code><code>if</code> <code>(style == FontStyle.Bold && tempFont.Bold || </code>
<code> </code><code>style == FontStyle.Italic && tempFont.Italic || </code>
<code> </code><code>style == FontStyle.Underline && tempFont.Underline) </code>
<code> </code><code>tempRichTextBox.SelectionFont = </code>
<code> </code><code>new</code> <code>Font(tempRichTextBox.SelectionFont, </code>
<code> </code><code>tempRichTextBox.SelectionFont.Style ^ style); </code>
<code> </code><code>else</code> <code>if</code> <code>(style == FontStyle.Bold && !tempFont.Bold || </code>
<code> </code><code>style == FontStyle.Italic && !tempFont.Italic || </code>
<code> </code><code>style == FontStyle.Underline && !tempFont.Underline) </code>
<code> </code><code>tempRichTextBox.SelectionFont.Style | style); </code>
<code> </code><code>tempRichTextBox.Select(tempRtbStart, len); </code>
<code> </code><code>curRichTextBox.SelectedRtf = tempRichTextBox.SelectedRtf;</code><code>//将設定格式後的副本拷貝給原型 </code>
<code> </code><code>curRichTextBox.Select(curRtbStart, len); </code>
<code>} </code>
這樣就避免了設定字型格式時的上述問題。
本文轉自靜默虛空部落格園部落格,原文連結:http://www.cnblogs.com/jingmoxukong/articles/2118114.html,如需轉載請自行聯系原作者