- PR -

RichTextBoxの文字色

1
投稿者投稿内容
adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 2004-10-26 09:28
C#で作っているプログラムの、
RichTextBox内の文字色を変更したいのですが、
以下のようなやり方しか思い浮かばず、困っています。

int intStart = 1; //変更位置
int intLen = 5; //変更長
richTextBox1.Select(intStart,intLen);
richTextBox1.SelectionColor = System.Drawing.Color.Blue;

この方法だとSelectをするタイミングで文字がハイライトされ
ちらついてしまいます。
何か方法があれば、教えていただけませんか?

※具体的にやりたいのは、
キーワード文字の色を変更したいのです。

よろしくお願いします
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-10-26 14:31
よくわかりませんが
VBAの場合の Range 見たいな物は見えないから rtf 全体を取り出し
replaceall のようにして、戻すとか?rtfの知識が必要ですが。

TextBoxにフォーカスを入れずに、Hide何とか状態でSelectionを
操作できるか?(裏技度高し)
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-10-26 22:13
南部です。

コード:
public class MyTextBox : RichTextBox 
{
    private bool suspend = false;
    
    public void SuspendPaint() { suspend = true; }
    public void ResumePaint() { suspend = false; }

    protected override void WndProc(ref Message m)
    {
        if(suspend && m.Msg == 0x000f) 
            return;
        base.WndProc (ref m);
    }
}



こんな感じの継承クラスを作って、

コード:
myTextBox.SuspendPaint(); //描画停止

int pos = myTextBox.SelectionStart; //現在の位置
myTextBox.Select(start, length); //選択
myTextBox.SelectionColor = Color.Blue; //色変え
myTextBox.Select(pos, 0); //位置戻し

myTextBox.ResumePaint(); //描画再開



こんな感じで色を変えていけば、よさげです。
#これが良いやり方かは、わかりませんが。

ちなみに、画面外の文字まで選択しようとすると、
スクロールバーがちらつきます。
#最小範囲の更新だけ行うと思いますが、、、
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-10-27 00:57
WM_SETREDRAWってRICHEDITはきかないんでしたっけ?

コード:


public class RichTextBoxEx : RichTextBox
{
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private const uint WM_SETREDRAW = 0x000b;


private int updateCount = 0;
public void BeginUpdate()
{
if(updateCount++==0)SendMessage(this.Handle, WM_SETREDRAW, 0, 0);
}
public void EndUpdate()
{
if(updateCount==0)throw new InvalidOperationException(
"BeginUpdate,EndUpdateは同じ回数だけ呼び出す必要があります。");
if(--updateCount==0)SendMessage(this.Handle, WM_SETREDRAW, 1, 0);
}
}



こんな感じのクラスを作って、更新するときにBeginUpdate,EndUpdateを呼び出すと。

[ メッセージ編集済み 編集者: ya 編集日時 2004-10-27 01:01 ]
adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 2004-10-27 09:17
WndProcをオーバーライドする方法で解決できました。
しかし「0x000f」とは?


ありがとうございました。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-10-27 09:48
南部です。

yaさんへ:
WM_SETREDRAWってこう使うんですね。
勉強になります。

adtkさんへ:
0x000fはWM_PAINTです。
yaさんが提供してくれたコードのほうが、「良い」と思います。
#ローカルで実行するなら。
いげ太
常連さん
会議室デビュー日: 2004/10/27
投稿数: 32
投稿日時: 2004-10-27 11:12
提示されているコードで考えるなら
Enabled = false でもいけそうな気がします。

コード:
int intStart = 1;
int intLen = 5;

richTextBox1.Enabled = false;

richTextBox1.Select(intStart,intLen); 
richTextBox1.SelectionColor = System.Drawing.Color.Blue;

richTextBox1.Enabled = true;


こんな感じかな?
1

スキルアップ/キャリアアップ(JOB@IT)