1

単語を受け入れる TextBox を使用してフォームを作成し、一連の文を検索して、その単語が含まれているかどうかを確認します。その後、それらの文を表示して単語を強調表示する必要があります。私の計画は、ListBox を作成し、その中の文。私の問題は、単語を強調表示して(私が推測する色を変更することによって)区別できるようにする方法です。

好ましい方法はありますか?探している文を選択できるように、ListBox を選択しました。

編集

@Thorsten Dittmar の指示に従って、所有者描画リスト ボックスを作成します。

public partial class Form1 : Form
    {
        private List<string> _items;

        public Form1()
        {
            InitializeComponent();
            _items = new List<string>();
            _items.Add("One");
            _items.Add("Two");
            _items.Add("Three");
            listBox1.DataSource = _items;
        }

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.DrawFocusRectangle();
            e.Graphics.DrawString(_items[e.Index],
                new Font(FontFamily.GenericSansSerif,
                    8, FontStyle.Bold),
                    new SolidBrush(Color.Red), e.Bounds);
        }
    }

1 つの単語だけを描くために文を分割するにはどうすればよいですか?

編集2

私が最終的に行った方法は、2 つの別個のコンポーネントを作成して、オプションを組み合わせることでした。1つはListBoxすべての文に色が付けられており、そのうちの1つを選択するオプションと、RichBox別の色付きの単語を選択するオプションがありましたListBox(少なくとも私にとっては)。

私がそれを達成した方法は、各文でどの単語を色付けするかを指すブール配列を使用することでした.

for (int i = 0; i < words.Length; i++)
{
  if (segments[i]) //<-boolean array
  {
     rich.SelectionColor = Color.Red;
     rich.AppendText(words[i] + " ");
     rich.SelectionColor = Color.Black;
  }
  else
  {
    rich.AppendText(words[i] + " ");
  }
}
4

4 に答える 4

1

Windowsフォームでそれを行う標準的な方法はありません。リストアイテムを手動でレンダリングする必要があります(所有者が描画するリストボックスを作成します)。WPFでは、これは簡単な作業です。

編集
別のフォントで文字列の一部だけを描画するのは簡単な作業ではありません。私が試したいのは次のとおりです。

「太字の開始」と「太字の終了」を示すトークンを導入します。これは、HTMLの場合と少し似ています。HTMLと同じように呼びましょう。したがって、文字列は次のようになります。

Hello, I am <b>bold</b> text<b>!</b>

次に、文字列を太字ではないテキストと太字のテキストにトークン化します。私は次の部分を手に入れるでしょう:

Hello, I am
bold
text
!

次に、次のアルゴリズムを使用して各パーツを描画します。

  1. 現在の位置xに現在の形式で文字列を描画します
  2. 手順1で描画した文字列の幅だけ位置xを増やします
  3. 今後の文字列に応じてフォーマットを変更する
  4. goto 1

ステップ2ではGraphics.MeasureString、文字列の幅を取得するためにメソッドが呼び出されます。

上記の4つのサンプルパーツに対してこれを行うと、次のようになります。

こんにちは、私は
こんにちは、私は太字
です こんにちは、私は太字のテキストです
こんにちは、私は太字のテキストです!

于 2012-05-31T12:58:27.993 に答える
0

@Thorsten Dittmarの回答に基づいて、単一のListBoxで探しているものをほぼ正確に開発しました。https://advancedlistbox.codeplex.com/で見つけることができます。

于 2013-03-12T18:38:54.733 に答える
0

Giannosfor さん、あなたのコメントに応えて、イベント ハンドラーのパラメーター e を使用して、強調表示する項目を選択する必要があります (ここにリンク)。

Shadow Wizard からの応答、特に e.Index の使用を見てください。

Graphics g = e.Graphics;
...
g.FillRectangle(new SolidBrush(color), e.Bounds);

変数 g は、現在のアイテム e のグラフィック部分を表します。メソッド FillRectangle を使用すると、アイテムの背景色を変更できます。

編集1:

以下のコメントであなたが言うようにしようとしましたが、ListBox を使用して文字列の一部だけをハイライトする方法がないようです。私には、RichTextBox をサポートできる唯一のコントロールのようです。解決策として、独自のユーザー コントロールを RichTextBox のリストの形式で実装することが考えられます。

于 2012-05-31T15:25:34.440 に答える
0

単純な TextBox は Foreground プロパティを設定できますが、TextBox 内のテキスト全体に適用されます。

特定の単語を「強調表示」したい場合は、文をいくつかの TextBox に分割する (ダーティ) か、RichTextBoxを使用する必要があります。

于 2012-05-31T12:53:21.837 に答える