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