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

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

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 スポンサー広告

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

カウンタ
ブログパーツ

 

更新履歴
 17/06/12
  SelectionFontがnullになる解決方法としてフォントの統一を追記



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

このコードのまま
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


動画
 
 

  
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);



 あ、なんだそんな事か ってカンジ。
自力解決したかったな~



 追記 17/06/12
    開発中のFakestickyより
   
    


 一応、もっとスマートな解決方法がある。
if (richTextBox1.SelectionFont == null)
{
       //ここで文字フォントを統一させてしまう
                    richTextBox1.SelectionColor = Color.Black;
                        richTextBox1.SelectionFont = new Font(DefaultFont.FontFamily, textsize, FontStyle.Regular);
                       
}
 これなら上記のようなちらつきとは無縁だ。


  ついでに1以上の数でインクリメント・デクリメントする方法
   int textsize+=2; のように書けばOK!
  


 各フォントサイズを残したまま文字サイズを変えるなんて魔法のような事も出来るらしいが、winAPIを用いた恐ろしく複雑なコードになるっぽい。何もそこまでしなくていいだろう・・・・|д゚)


 前述の処理はsimple sticky notesで実現している。興味があるなら探してみるのもいいだろう。
 DL http://www.vector.co.jp/soft/winnt/personal/se504903.html 
 解説:http://freesoft-100.com/review/simplestickynotes.html


 外観はほぼストアアプリのようなもので、かなり細かいとこまで作りこまれている。
関連記事
スポンサーサイト

 【C#】Fakesticky

 Fakesticky

- 0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。