リッチテキストボックスで特定の文字列の文字修飾を変えたいと思っています。
あらかじめ予約しておいた単語などをキーワードハイライティングしたいんです。
色を変えたり大きさを変えたり太字にしたり…。
正規表現は使えます。VB6です。
よろしくお願いします。
自分で調べてみたのですがInStrやSelColorを使ったり
するのは見つけました。これでも何とかなるのですが、
エディタとして使いたいので、変更されるたびに、
カーソルが上から下まで移動して、元の位置に戻るというのは
イマイチだと思っています。
もっといい方法はないでしょうか?
RichTextBox.TextRTF
のTextRTFを直接書き換えます、高速です。
TextRTFはHTMLと似たような構造になっています。
ただ文字の色設定はカラーテーブル参照になります。
リッチテキストのフォーマット丹念に探せばマイクロソフトの
どこかに有ります。
"WinHelpの"ですから、すべてが同じとは言い切れませんけど、
わたしの使っているソフトのヘルプに、その辺のことが載っていたので、紹介します。
Koji27.com(http://www.koji27.com/)>ソフトウェア>HelpDesigner関連ツール&ヘルプ>初めてのヘルプデザイナー・ヘルプ
このヘルプの中に、"RTF Token"のページがあります。
ヘルプを開いて、キーワードで探してみてください。
WinHelpは基本がリッチテキストフォーマットなので、概要はわかるかもしれません。
(最終的には結局専門のサイトに行ったほうがよさそうですけど、RTFファイルヘッダとか、解説ありませんし)
RTFの構造ならば、MSDNライブラリに掲載されていますよ。
VB6付属版、VB.NET付属版、定期配布版などで掲載位置は異なりますが、
VB6対応版のライブラリなら、
+[技術仕様書]
+[Specifications]
+[Rich Text Format (RTF) Specification, version 1.6]
VB.NET対応版なら、
+[Office ソリューション開発]
+[Office Solutions Development (英語)]
+[Microsoft Word]
+[Microsoft Word (General)]
+[Rich Text Format (RTF) Specification, version 1.6]
あたりにあると思われます。
皆さんありがとうございます。
すこしずつできてきました。
index = TxtBodyFileContents.SelStart
TxtBodyFileContents.Object = Replace(TxtBodyFileContents.Object, "--", "{\b\red0\green64\blue0--}")
TxtBodyFileContents.SelStart = index
今こんな感じなんですが、イタリックとかボールドはうまくいきました。
でも、色がかえられないんです。
それから、カーソルを維持する方法って上記の感じが妥当なんでしょうか?
また、この方法だと、色を変更するキーワードの直後に文字を挿入すると
その文字も属性を引っ張ってしまいますよね。これは少し何とかしたいです。
お知恵をお貸しください。
いっぱい聞いてしまってすみません。よろしくお願いします。
色がかえられないと書きましたが。
通常の見た目は。です。
文字列を選択してみると、そこの部分は色が変わっているので、
文字色属性が付加され、リッチテキストボックスに表示されているようです。
なんなんでしょう?プロパティが悪いんでしょうか?
> でも、色がかえられないんです。
RTFヘッダで指定したカラーテーブルの内容と、
RTF文書エリアで指定した文字色番号(\cf番号)の内容に
食い違いがあるのでは無いでしょうか?
> また、この方法だと、色を変更するキーワードの直後に文字を挿入すると
> その文字も属性を引っ張ってしまいますよね。これは少し何とかしたいです。
Wordなども、そのような実装になっていますね。
よくやる間違いは「\cf1 」最後にスペースを入れるのを忘れる。
ただし
>文字列を選択してみると、そこの部分は色が変わっているので、
が良くわからない、セレクトして反転すると色が変わるってことかな。
> その文字も属性を引っ張ってしまいますよね。これは少し何とかしたいです。
魔界の仮面弁士さんの言われるとおりRTFの仕様ではないかと。
私の作ったHTMLテキストエディターでもそうなります。
フリーソフトだから誰も文句言わないけど、どうにかしたい。(^^;
↑(ホームページにあるやつ)
↑と書いたけど
>よくやる間違いは「\cf1 」最後にスペースを入れるのを忘れる。
は間違えでした。
Textboxを一つおいて
RichTextBox1.Text = "AB"
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = 1
RichTextBox1.SelColor = RGB(255, 0, 0)
RichTextBox1.SelStart = 1
RichTextBox1.SelLength = 1
RichTextBox1.SelBold = True
RichTextBox1.SelLength = 0
RichTextBox1.SelStart = 0
Text1.Text = RichTextBox1.Object
を実行してみてください。
リッチテキストに"AB"の二文字だけ表示して
Aは赤、Bはボールドの黒というだけのコードですが
こうやって生成されるRichTextBox1.TextRTF と自作に
書き換えの結果が同じになるか見ながら調整するのが
簡単です。
とりあえず”\viewkind”の前に
カラーテーブル{\colortbl ;\red255\green0\blue0;}
が出来ているかとか。
皆さまありがとうございます。
御礼が遅くなってしまってすみません。
トンでもないとがわかりました。
私の環境が液晶ディスプレイを使用しているのですが、
{\b\red0\green64\blue0}では色が足りなくて、
黒なのか微妙に緑がかかっているのか判別できなかっただけで
実際には色が変わっていました。ゴメンナサイ…
また、
>その文字も属性を引っ張ってしまいます
も内容が変わるたびに、文字修飾属性を取り除くだけで解決できました。
例
rtfRead = Replace(rtfRead, "\cf1\b ", "")
rtfRead = Replace(rtfRead, "\\b0\cf0 ", "")
(このあとカラーテーブルの追加と変更したいキーワードの色変更を行う)
ねろさんも是非試してみてください。
(とっつきにくくて)時間がかかってしまいましたが、TextRTFの操作が
大体わかりました。ありがとうございました。
>私の環境が液晶ディスプレイを..色が足りなくて、
「画面のプロパティ」で True Color (32ビット)に変更したらいかがですか。
>文字修飾属性を取り除くだけで解決できました
>ねろさんも是非試してみてください。
さすがに私もそれはわかっているんですが (^^;
3ヶ月で10,000本位DLされたソフトなんでそんなにはおかしくないんですが、
タグとその他の部分を色分しているんですが、タグの<>の中は色の属性
が変わってほしくなくて、タグの外は文字の右側の属性になってほしいの
ですが、これがなかなか厄介で......
私の相談をしてもしょうがないか。
解決出来て何よりでした。
ツイート | ![]() |