直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円、家賃4万円で生活するひつじ人間。

注釈C# RichTextBox内の文字フォントや文字色を部分的に変える

カウンタ
ブログパーツ


文字列を検索して、色とフォントを変更する より

このコードのまま
pos = RichTextBox1.Find(searchWord, pos, RichTextBoxFinds.None);

 だと
0 ひつじ
1 ひつじ
2 ひつじ
3 ひつじ
4 ひつじ
5 ひつじ
6 ひつじ

 のような重複文字列があると、先の行の文字列を先に選択してしまうという欠点がある。
結果、6行目の選択で3行目のフォントカラーが変わるという事が起こる。

 このような欠点を解消する方法。
string searchWord = richTextBox1.SelectedText;
を使い

if (richTextBox1.Find(searchWord, currentSelectionStart, RichTextBoxFinds.WholeWord) >= 0)

などとした。
 つまり、現在キャレットまでの行数じゃなくて、総文字数を取得する必要があった。
 
コード
private void RichtextSerect() { string searchWord = richTextBox1.SelectedText; //現在の選択状態を覚えておく int currentSelectionStart = richTextBox1.SelectionStart; int CurrentLine = richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart); int pos = CurrentLine; if ( CurrentLine >= 0) { //文字列を検索して、選択状態にする if (richTextBox1.Find(searchWord, currentSelectionStart, RichTextBoxFinds.WholeWord) >= 0) { //文字色を赤にする richTextBox1.SelectionColor = Color.Red; richTextBox1.SelectionFont = new Font("arial", 16); } } //選択状態を元に戻す //richTextBox1.Select(currentSelectionStart, currentSelectionLength); }


private void richTextBox1_MouseCaptureChanged(object sender, EventArgs e)
{
//マウスで選択すると発生 
RichtextSerect();
}


//ついでに付け加えた。
   private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((Control.ModifierKeys & Keys.Control) == Keys.Control & e.KeyCode == Keys.D)
{
//初期状態に戻す
richTextBox1.SelectionColor = Color.Black;
richTextBox1.SelectionFont = new Font(DefaultFont, FontStyle.Regular);
}
}

 

 これで、何処を選んでも選択した文字だけフォントや文字サイズが変わる。

開発中


泥沼に嵌ったわけではないが、少々手間取ったな。





 追記 17/01/08
 選択行が複数だとSelectionFontがNullを返すのだが、これを解決する方法

 元記事
nullReferenceException when using RichTextBox.SelectionFont
  http://stackoverflow.com/questions/21089167/nullreferenceexception-when-using-richtextbox-selectionfont


動画
 http://mojakouinfotaker.blog.fc2.com/blog-entry-890.html 
 

  
private void SetFontSize()
        {
          #region  オリジナルのキャレット
           selectionStart = richTextBox1.SelectionStart;
   //開始キャレット
           selectionLength = richTextBox1.SelectionLength;
   //キャレットの長さ
           selectionEnd = selectionStart + selectionLength;
            //最終キャレット位置=開始点+キャレットの長さ
  #Endregion


                for (int x = selectionStart; x < selectionEnd; ++x)
                {
                    // 常に1文字目を選択させる
                    richTextBox1.Select(x, 1);
          
                    //    フォント適用
                    richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont.FontFamily, textsize, richTextBox1.SelectionFont.Style);
                  
                }
                // 元のキャレットに戻す
                richTextBox1.Select(selectionStart, selectionLength);



 あ、なんだそんな事か ってカンジ。
自力解決したかったな~
関連記事
スポンサーサイト

 Category: None

0 Comments

Leave a comment