C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: RichTextBoxのSelectionColor


(過去ログ 22 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■9772 / inTopicNo.1)  RichTextBoxのSelectionColor
  
□投稿者/ はこ (1回)-(2007/11/04(Sun) 15:59:23)

分類:[C#] 

こんにちは。
フォームにRichTextBoxを配置しまして、ユーザーが文字色を
いろいろ変えながら文章を作成します。
それを特定のボタンが押された時に、どの文字が何色で
表示されているか一文字ずつ調べていって、色が変わった時に
特定のことをする、ということをしたいんですけど。

Color colSelect = new Color();
for (int i = 0; i < RichTextBox1.Text.Length; i++)
{
    RichTextBox1.Select(i, 1);
    
    // 文字表示色
    if (RichTextBox1.SelectionColor != colSelect)
    {
        if (RichTextBox1.SelectionColor == BLACK)
        {
            // 黒色
        }
        else if (RichTextBox1.SelectionColor == BLUE)
        {
            // 青色
        }
        // 中略
        colSelect = RichTextBox1.SelectionColor;
    }
}

上のようにやっているんですが、現状は色が変わっている文字を
判定するループに入ってもSelectionColorが変わりません。
.Rtfプロパティの値をみると、colortblに一色しか残っていないので、
そのせいだとは思うのですが、こういったことはできないのでしょうか?

VB6で同じようなことをしていたことがありまして、その際は
下のようにしてうまく判定できていたのですが・・・

For i = 1 To Len(RichTextBox1.Text)
    RichTextBox1.SelStart = i
    
    '表示文字色変更?
    If RichTextBox1.SelColor <> color Then
        If rtxtDispData.SelColor = BLACK Then
          '黒
        ElseIf rtxtDispData.SelColor = BLUE Then
          '青
        End If
        color = RichTextBox1.SelColor
    End If
Next

.SaveFileしてRTF形式でファイルに保存して、できたファイルを
エディタで開いてみるとcolortblがちゃんと保存されているので
とれるような気はするのですが。
でも一度RTFファイルに保存してから、そのファイルを.LoadFileして、
それから最初のようなコードを実行しても、やはりSelectionColorは
変わりません。

どうにかしてVB6のコードでしているようなことを、C#で実現することは
できないでしょうか?
長くなってすみません。
よろしくお願いします。

開発環境:WindowsXP SP2
使用言語:Microsoft Visual C# 2005

引用返信 編集キー/
■9781 / inTopicNo.2)  Re[1]: RichTextBoxのSelectionColor
□投稿者/ Tesla (8回)-(2007/11/04(Sun) 19:33:20)
>         if (RichTextBox1.SelectionColor == BLACK)
>         {
>             // 黒色
>         }
>         else if (RichTextBox1.SelectionColor == BLUE)

ソースをそのままコピーしてみましたが、BLACK,BLUEが宣言されていないのでビルドエラーになります。
宣言箇所も含めて提示してもらえませんか?

引用返信 編集キー/
■9782 / inTopicNo.3)  Re[2]: RichTextBoxのSelectionColor
□投稿者/ はこ (2回)-(2007/11/04(Sun) 19:54:13)
> ソースをそのままコピーしてみましたが、BLACK,BLUEが宣言されていないのでビルドエラーになります。
> 宣言箇所も含めて提示してもらえませんか?

すみません。
試していただいて、ありがとうございます。


private Color BLACK = Color.Black;
private Color BLUE = Color.Blue;

↑
宣言はこんな感じです。
実際には他の色も定義しています。

「宣言箇所も含めて」とは他にも必要な箇所がありますか?
先に提示したfor文のブロックはボタンのクリックイベントで、
こんな感じで使っているのですが。
↓

private void Button1_Click(object sender, EventArgs e)
{
    Color colSelect = new Color(); 
    for (int i = 0; i < RichTextBox1.Text.Length; i++)
    {
        RichTextBox1.Select(i, 1);
    
        // 文字表示色
        if (RichTextBox1.SelectionColor != colSelect)
        {
            if (RichTextBox1.SelectionColor == BLACK)
            {
                // 黒色
            }
            else if (RichTextBox1.SelectionColor == BLUE)
            {
                // 青色
            }
            // 中略
            colSelect = RichTextBox1.SelectionColor;
        }
    }
}

よろしくお願いします。


引用返信 編集キー/
■9786 / inTopicNo.4)  Re[3]: RichTextBoxのSelectionColor
□投稿者/ Tesla (10回)-(2007/11/04(Sun) 21:09:30)
> フォームにRichTextBoxを配置しまして、ユーザーが文字色を
> いろいろ変えながら文章を作成します。

ユーザーが変えた文字色をRichTextBoxに反映する箇所はどうなっていますか?


> 上のようにやっているんですが、現状は色が変わっている文字を
> 判定するループに入ってもSelectionColorが変わりません。
> .Rtfプロパティの値をみると、colortblに一色しか残っていないので、

colortblに一色しか残っていないのが気になります。

こちらで確認したところ、コードで設定した文字色はRtfプロパティのcolortblに反映されていました。
{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;\red255\green0\blue0;}

-- 確認したコード
RichTextBox1.Text = "abc";

RichTextBox1.Select(0, 1);
RichTextBox1.SelectionColor = Color.Black;

RichTextBox1.Select(1, 1);
RichTextBox1.SelectionColor = Color.Blue;

RichTextBox1.Select(2, 1);
RichTextBox1.SelectionColor = Color.Red;

引用返信 編集キー/
■9789 / inTopicNo.5)  Re[4]: RichTextBoxのSelectionColor
□投稿者/ はこ (3回)-(2007/11/04(Sun) 21:27:54)
> ユーザーが変えた文字色をRichTextBoxに反映する箇所はどうなっていますか?

実は画面上には色選択用のラジオボタンもありまして。
(.Appearance=Buttonとなっています)
ラジオボタンが選択されたときに、RichTextBoxの
SelectionColorを変更しています。
以下がコードです。
(BLACKだけですけど、他の色も同様にしています)

private void radioBlack_Click(object sender, EventArgs e)
{
    // 選択部分の文字色更新
    RichTextBox1.SelectionColor = BLACK;
    RichTextBox1.Focus();
}

それから念のために、RichTextBoxにフォーカスが当たった時に、
SelectionColorを現在選択されている色に設定しています。
以下がそのコードです。

private void RichTextBox1_GotFocus(object sender, EventArgs e)
{
    // 文字色再設定
    if (radioBlack.Checked) RichTextBox1.SelectionColor = BLACK;
    else if (radioBlue.Checked) RichTextBox1.SelectionColor = BLUE;
    // 以下略
}


情報を小出しにして申し訳ありません。
よろしくお願いします。

引用返信 編集キー/
■9792 / inTopicNo.6)  Re[5]: RichTextBoxのSelectionColor
□投稿者/ Tesla (12回)-(2007/11/04(Sun) 22:41:44)
提示してもらった文字色を変更するコードをコピーし確認しましたが、問題なく動作しているようです。

次のように入力しました。
abc(文字色はa: BLACK、b:BLUE、c:RED)

RTFプロパティのcolortblはこのようになっていました。
{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;\red255\green0\blue0;}

以下のSelectionColor判定も正しく動作しているようです。

> Color colSelect = new Color();
> for (int i = 0; i < RichTextBox1.Text.Length; i++)
> {
>     RichTextBox1.Select(i, 1);
>     
>     // 文字表示色
>     if (RichTextBox1.SelectionColor != colSelect)
>     {
>         if (RichTextBox1.SelectionColor == BLACK)
>         {
>             // 黒色
>         }
>         else if (RichTextBox1.SelectionColor == BLUE)
>         {
>             // 青色
>         }
>         // 中略
>         colSelect = RichTextBox1.SelectionColor;
>     }
> }
> 
> 上のようにやっているんですが、現状は色が変わっている文字を
> 判定するループに入ってもSelectionColorが変わりません。


> テキスト: abc
> a: BLACK、b:BLUE、c:RED
このように入力すると、RTFプロパティのcolortblはどうなりますか?

引用返信 編集キー/
■9794 / inTopicNo.7)  Re[6]: RichTextBoxのSelectionColor
□投稿者/ はこ (4回)-(2007/11/04(Sun) 23:09:13)
>>テキスト: abc
>>a: BLACK、b:BLUE、c:RED
> このように入力すると、RTFプロパティのcolortblはどうなりますか?

確認していただいてありがとうございます。
私はこの手順でやりました。

1.黒ボタンを押下。
2.RichTextBoxに「a」を入力。
3.青ボタンを押下。
4.RichTextBoxに「b」を入力。
5.赤ボタンを押下。
6.RichTextBoxに「c」を入力。
7.判定ボタンを押下して、文字色判定。

上記のようにしたところ、.Rtfのcolortblは
{\\colortbl ;\\red0\\green0\\blue0;}
となっており、黒しか残っていないようです。
画面上で見ると、ちゃんとそれぞれの色をしているのですが。。。

引用返信 編集キー/
■9837 / inTopicNo.8)  Re[7]: RichTextBoxのSelectionColor
□投稿者/ Tesla (13回)-(2007/11/05(Mon) 21:08:16)
そうですか。黒しか残りませんか。。。

こちらで確認のとれたソースをUpするので、これで正常に動作するようならご自分のソースと見比べてみて下さい。
新規プロジェクトを作成して、Form1のソースを以下で置き換えればOKです。

	public partial class Form1 : Form
	{
		private Color BLACK = Color.Black;
		private Color BLUE = Color.Blue;
		private Color RED = Color.Red;

		private System.Windows.Forms.RichTextBox RichTextBox1;
		private System.Windows.Forms.Button btnColor;
		private System.Windows.Forms.Button btnRtf;
		private System.Windows.Forms.RadioButton radioBlack;
		private System.Windows.Forms.RadioButton radioBlue;
		private System.Windows.Forms.RadioButton radioRed;

		public Form1()
		{
			InitializeComponent();

			Initialize();

			this.RichTextBox1.GotFocus += new EventHandler(RichTextBox1_GotFocus);

			this.radioBlack.Click += new EventHandler(radioBlack_Click);
			this.radioBlue.Click += new EventHandler(radioBlue_Click);
			this.radioRed.Click += new EventHandler(radioRed_Click);
			this.btnRtf.Click += new EventHandler(buttonRtf_Click);
			this.btnColor.Click += new EventHandler(btnColor_Click);
		}

		private void Initialize()
		{
			this.RichTextBox1 = new System.Windows.Forms.RichTextBox();
			this.btnColor = new System.Windows.Forms.Button();
			this.btnRtf = new System.Windows.Forms.Button();
			this.radioBlack = new System.Windows.Forms.RadioButton();
			this.radioBlue = new System.Windows.Forms.RadioButton();
			this.radioRed = new System.Windows.Forms.RadioButton();
			this.SuspendLayout();
			// 
			// RichTextBox1
			// 
			this.RichTextBox1.Location = new System.Drawing.Point(13, 13);
			this.RichTextBox1.Name = "RichTextBox1";
			this.RichTextBox1.Size = new System.Drawing.Size(424, 248);
			this.RichTextBox1.TabIndex = 0;
			this.RichTextBox1.Text = "";
			// 
			// btnColor
			// 
			this.btnColor.Location = new System.Drawing.Point(235, 274);
			this.btnColor.Name = "btnColor";
			this.btnColor.Size = new System.Drawing.Size(75, 23);
			this.btnColor.TabIndex = 1;
			this.btnColor.Text = "色判定";
			this.btnColor.UseVisualStyleBackColor = true;
			// 
			// btnRtf
			// 
			this.btnRtf.Location = new System.Drawing.Point(154, 274);
			this.btnRtf.Name = "btnRtf";
			this.btnRtf.Size = new System.Drawing.Size(75, 23);
			this.btnRtf.TabIndex = 4;
			this.btnRtf.Text = "RTF出力";
			this.btnRtf.UseVisualStyleBackColor = true;
			// 
			// radioBlack
			// 
			this.radioBlack.Appearance = System.Windows.Forms.Appearance.Button;
			this.radioBlack.AutoSize = true;
			this.radioBlack.Location = new System.Drawing.Point(13, 274);
			this.radioBlack.Name = "radioBlack";
			this.radioBlack.Size = new System.Drawing.Size(27, 22);
			this.radioBlack.TabIndex = 5;
			this.radioBlack.TabStop = true;
			this.radioBlack.Text = "黒";
			this.radioBlack.UseVisualStyleBackColor = true;
			// 
			// radioBlue
			// 
			this.radioBlue.Appearance = System.Windows.Forms.Appearance.Button;
			this.radioBlue.AutoSize = true;
			this.radioBlue.Location = new System.Drawing.Point(46, 274);
			this.radioBlue.Name = "radioBlue";
			this.radioBlue.Size = new System.Drawing.Size(27, 22);
			this.radioBlue.TabIndex = 6;
			this.radioBlue.TabStop = true;
			this.radioBlue.Text = "青";
			this.radioBlue.UseVisualStyleBackColor = true;
			// 
			// radioRed
			// 
			this.radioRed.Appearance = System.Windows.Forms.Appearance.Button;
			this.radioRed.AutoSize = true;
			this.radioRed.Location = new System.Drawing.Point(79, 274);
			this.radioRed.Name = "radioRed";
			this.radioRed.Size = new System.Drawing.Size(27, 22);
			this.radioRed.TabIndex = 7;
			this.radioRed.TabStop = true;
			this.radioRed.Text = "赤";
			this.radioRed.UseVisualStyleBackColor = true;
			// 
			// Form1
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.ClientSize = new System.Drawing.Size(452, 308);
			this.Controls.Add(this.radioRed);
			this.Controls.Add(this.radioBlue);
			this.Controls.Add(this.radioBlack);
			this.Controls.Add(this.btnRtf);
			this.Controls.Add(this.btnColor);
			this.Controls.Add(this.RichTextBox1);
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);
			this.PerformLayout();
		}

		void btnColor_Click(object sender, EventArgs e)
		{
			StringBuilder sb = new StringBuilder();

			Color colSelect = new Color();
			for (int i = 0 ; i < RichTextBox1.Text.Length ; i++)
			{
				RichTextBox1.Select(i, 1);

				// 文字表示色
				if (RichTextBox1.SelectionColor != colSelect)
				{
					if (RichTextBox1.SelectionColor == BLACK)
					{
						// 黒色
						sb.Append("BLACK\n");
					}
					else if (RichTextBox1.SelectionColor == BLUE)
					{
						// 青色
						sb.Append("BLUE\n");
					}

					if (RichTextBox1.SelectionColor == RED)
					{
						sb.Append("RED\n");
					}

					// 中略
					colSelect = RichTextBox1.SelectionColor;
				}
			}

			MessageBox.Show(sb.ToString());
		}

		void RichTextBox1_GotFocus(object sender, EventArgs e)
		{
			// 文字色再設定
			if (radioBlack.Checked) RichTextBox1.SelectionColor = BLACK;
			else if (radioBlue.Checked) RichTextBox1.SelectionColor = BLUE;
			else if (radioRed.Checked) RichTextBox1.SelectionColor = RED;
			// 以下略
		}

		private void radioBlack_Click(object sender, EventArgs e)
		{
			// 選択部分の文字色更新
			RichTextBox1.SelectionColor = BLACK;
			RichTextBox1.Focus();
		}

		private void radioBlue_Click(object sender, EventArgs e)
		{
			RichTextBox1.SelectionColor = BLUE;
			RichTextBox1.Focus();
		}

		private void radioRed_Click(object sender, EventArgs e)
		{
			RichTextBox1.SelectionColor = RED;
			RichTextBox1.Focus();
		}

		private void buttonRtf_Click(object sender, EventArgs e)
		{
			MessageBox.Show(RichTextBox1.Rtf);
		}
	}


それと、本題からは逸れますが気になった点があるので書いておきます。

・GotFocusの使用は推奨されていません。代わりにEnterを使用します。
Control.GotFocus イベント (System.Windows.Forms)
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.gotfocus.aspx

・そもそもGotFocusの文字色再設定の処理は不要ではないですか?ラジオボタンのクリックで色を設定していますから。

引用返信 編集キー/
■9840 / inTopicNo.9)  Re[8]: RichTextBoxのSelectionColor
□投稿者/ mあ@反省中 (9回)-(2007/11/05(Mon) 22:23:30)
全然関係無いけど、VB.NET版。express2005 で。

そんなこと知ってるわ、って言われそうだけどw、イベントは纏めました。

colortbl には、ちゃんと指定した色数分出ていましたよ。


Public Class Form1

    Private rich As New RichTextBox

    Private grbs As New GroupRadioBox

    Public Class GroupRadioBox
        Private radios As New List(Of RadioButton)

        Private selectedColor As Color = Color.Black

        Public Sub New()
            Add(Color.Black, Color.Black)
            Add(Color.Red, Color.Red)
            Add(Color.Yellow, Color.Yellow)
            Add(Color.SkyBlue, Color.SkyBlue)
            Add(Color.Violet, Color.Violet)
        End Sub

        Public ReadOnly Property CurrentColor() As Color
            Get
                Return selectedColor
            End Get
        End Property

        Public Sub Add(ByVal dispColor As Color, ByVal selectColor As Color)
            Dim radio As New RadioButton
            radio.Appearance = Appearance.Button
            radio.Size = New Size(20, 20)
            radio.BackColor = dispColor
            radio.Tag = selectColor
            radios.Add(radio)

            AddHandler radio.Click, AddressOf radioSelected
        End Sub

        Public Function GetLayout() As Panel
            Dim flow As New FlowLayoutPanel
            flow.FlowDirection = FlowDirection.LeftToRight
            flow.Height = 30
            For i As Integer = 0 To radios.Count - 1
                flow.Controls.Add(radios.Item(i))
            Next
            radios.Item(0).PerformClick()
            Return flow
        End Function

        Private Sub radioSelected(ByVal s As Object, ByVal e As EventArgs)
            Dim radio As RadioButton = DirectCast(s, RadioButton)
            selectedColor = DirectCast(radio.Tag, Color)
            Console.WriteLine(radio.Tag)

        End Sub
    End Class

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        grbs.Add(Color.Aqua, Color.Aqua)
        grbs.Add(Color.Coral, Color.Coral)
        grbs.Add(Color.Firebrick, Color.Firebrick)

        Dim pane As Panel = grbs.GetLayout()
        pane.Dock = DockStyle.Bottom

        Dim btn1 As New Button
        btn1.Text = "Change"
        btn1.Dock = DockStyle.Bottom
        AddHandler btn1.Click, AddressOf ColorChangeEvent


        Dim btn2 As New Button
        btn2.Text = "Save"
        btn2.Dock = DockStyle.Bottom
        AddHandler btn2.Click, AddressOf SaveAs

        rich.Dock = DockStyle.Fill

        Controls.Add(rich)
        Controls.Add(pane)
        Controls.Add(btn1)
        Controls.Add(btn2)

        Dim prop As New PropertyGrid
        prop.Dock = DockStyle.Right
        prop.SelectedObject = rich
        prop.Width = 150
        Controls.Add(prop)

    End Sub

    Private Sub SaveAs(ByVal s As Object, ByVal e As EventArgs)
        rich.SaveFile("C:\rich.result")
    End Sub

    Private Sub ColorChangeEvent(ByVal s As Object, ByVal e As EventArgs)
        rich.SelectionColor = grbs.CurrentColor
    End Sub

    Private Sub InsertHtmlSpan()
    End Sub

End Class

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -