DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数段落のテキストのスタイルを変更

環境/言語:[Windows 7, .NET Framework 4.0]
分類:[.NET]

こんにちは。初めて投稿させていただきます。ウィンドウズのプログラミングは大体5ヶ月ぐらいやっています。以前は他の環境で。。。

ボタンを押した後、RichTextBoxコントロールにあるテキストのスタイル(bold, italic, underline, strikeoutなど)を変更するためのコードを書いています。以下のコードはその例です。

Dim myFont As String = RichTextBox1.SelectionFont.Name
Dim mySize As Integer = RichTextBox1.SelectionFont.Size
Dim NewFontStyle As New FontStyle
With myFont
NewFontStyle = RichTextBox1.SelectionFont.Style Xor FontStyle.Bold
RichTextBox1.SelectionFont = New Font(myFont, mySize, NewFontStyle)
End With

もし選択されたテキストの段落(paragraph)数が1つだと、問題なく、他のスタイルを保ったまま、選択されたスタイル(上のコードではbold)のみ変更(追加/削除)されます。一方段落が複数だとerrorが起きたり、または既存のスタイルが取り消されたりしてしまいます。

もちろんFontDialogを使えば問題なくスタイルを変更することができることは知っています。Microsoft社のWordPadの場合は、(FontDialogを使わなくてもboldのボタンを押しただけで)複数の段落が選択されていても既存のスタイルが変更されることなく、選択されたスタイルが追加/削除されます。FontDialogを使わずにテキストのスタイルをうまく変更する方法はあるでしょうか?もしかすると、段落を一時的に取り除き、スタイルを変更してまた元の段落を挿入するとか?

以上宜しくお願いします。
■No30298に返信(缶吉さんの記事)

こんにちは。

複数行にまたがるフォントの変更ができないというよりも、選択されている範囲のフォントをすべて一律に変更していることが問題なのではないでしょうか?つまりこの方法ですと、選択されている範囲に、SelectionFontとは違うフォントを使っている部分があったとしても、それを無視して全体を同じフォントにしてしまっています。

この解決法を調べてみましたが、私にはきれいな方法を見つけられませんでした。

RichTextBoxExtended - CodeProject
http://www.codeproject.com/Articles/9543/RichTextBoxExtended

のコードを見てみると、選択されている範囲の文字のフォントを1文字ずつ変更していました。確かに1文字ずつ変更すれば、うまくいきそうです。
■No30311に返信(管理人さんの記事)
> ■No30298に返信(缶吉さんの記事)
>
> こんにちは。
>
> 複数行にまたがるフォントの変更ができないというよりも、選択されている範囲のフォントをすべて一律に変更していることが問題なのではないでしょうか?つまりこの方法ですと、選択されている範囲に、SelectionFontとは違うフォントを使っている部分があったとしても、それを無視して全体を同じフォントにしてしまっています。
>
> この解決法を調べてみましたが、私にはきれいな方法を見つけられませんでした。
>
> RichTextBoxExtended - CodeProject
> http://www.codeproject.com/Articles/9543/RichTextBoxExtended
>
> のコードを見てみると、選択されている範囲の文字のフォントを1文字ずつ変更していました。確かに1文字ずつ変更すれば、うまくいきそうです。


どうも早速のご返答ありがとうございます。

「選択されている範囲のフォントをすべて一律に変更している」というご指摘ですが、実際、フォントとそのサイズを選択しないように色々やってみた結果です。つまりどちらかが抜けているとエラーがでるので、両方とも宣言しなければならないと考えています。

そのCodeProjectの作品は見たことがありません。早速確認してみます。ただフォントを1文字ずつ変更するというのはどうでしょうか?自分も似た様なことをやってみました。http://en.wikipedia.org/wiki/Steve_Jobs の長文を使ったところ異常に時間がかかってしまいました。

ますますMicrosoft社がどのようにしてやっているのかが不思議でたまりません。恐らく全て段落をとってしまう(1つのLineにする)方法しか残っていないように思えます。

どうもありがとうございました。
管理人さん、

確かに「RichTextBoxExtended」では一文字ずつスタイルを比較するのを確認しました。でもこのやり方は前述のWikipediaの長文(TextBoxの標準の文字制限を超える)などで使うには非現実でしょう。WordPadだとそのような長文でもスタイルの追加・削除を一瞬でやり遂げるので、別の方法を使っていると思います。一方このようなやり方もあることがわかり、少なからず参考になりました。ありがとうございます。
リッチテキストのスタイルのみ(太字・斜体・下線・取消線等)を変更したいとのことであれば、
選択された箇所のSelectedRtfの内容を直接書き換えるという方法もあり、これであれば高速に処理ができます。
ただし、この場合、RTFフォーマットを理解する必要がありますが、実際にこれらスタイルを変更した時に
RTFでどのように表されているかを調べれば、後は文字列処理になりますので、頑張って色々と
試してみてください。
■No30316に返信(ズッカさんの記事)
> リッチテキストのスタイルのみ(太字・斜体・下線・取消線等)を変更したいとのことであれば、
> 選択された箇所のSelectedRtfの内容を直接書き換えるという方法もあり、これであれば高速に処理ができます。
> ただし、この場合、RTFフォーマットを理解する必要がありますが、実際にこれらスタイルを変更した時に
> RTFでどのように表されているかを調べれば、後は文字列処理になりますので、頑張って色々と
> 試してみてください。


ズッカさん、

ご助言ありがとうございます。

なるほど。。。それは名案のような気がします。残念ながらRTFの詳しい仕組みのことは知りません。自分で出来る様なことか調べてみます。

どうもありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板