4

おはようございます。

通常のツリービューを画面に描画するカスタム ツリービュー コントロールと、その他のさまざまなものを作成しました。ペイント イベント中に、次のメソッドを使用して、node.text 文字列をツリービュー コントロールに描画します。

node.text = "ABCDEFG"
g.DrawString(node.Text, tvFont, Brushes.Black, strPosX + 10, bothPosY)

基本的に、私がやろうとしているのは、node.text の一部をイタリック体にして、画面上で次のようにレンダリングすることです...

AB*CDE*FG

個人的には、3 つの異なる文字列を効果的に描画する方法でこれに取り組みます... 2 つの非イタリック体と 1 つのイタリック体ですが、これには追加の配置が必要になります。

フォント形式の文字列を効果的に連結し、それをドローストリングの最初のパラメーターとして配置できることを願っていますが、これは実際に可能ですか? もしそうなら、どうすればそれを行うことができますか、および/または私を助けるリソースはありますか.

私はwinformsとvisualbasic .net Framework 3.5を使用しています(残念ながら、これは作業プロジェクトであり、これはソフトウェアが設計されている環境であるため、前述のものは変更できません)

4

2 に答える 2

3

フォント形式の文字列を効果的に連結して、それをdrawstringの最初のパラメーターとして配置できることを期待していますが、これは実際に可能ですか?

いいえ、これは不可能です。このDrawString関数は、指定したフォーマットフラグを使用して、指定したすべてのテキストを描画します。それはオール・オア・ナッシングの事件です。

一部を太字にし、他の部分を太字にしない場合は、DrawString関数を複数回呼び出す必要があります。それを達成するためにいくつかの追加のポジショニングが必要ですが、それほど難しいことではありません。x座標のみが変更されています。y座標は同じままである必要があります。フォントの面を変更するなどの凝ったことをしない限り、ベースラインが台無しになり、結果が醜い不一致のように見えるのを防ぐためにそれを補正する必要があります


それとは別に、代わりに[`TextRenderer.DrawText`関数](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.textrenderer.drawtext)を使用することをお勧めします`Graphics.DrawString`関数の。前者の利点は、GDIを使用してテキストを描画することです。これは、組み込みのネイティブコントロールがテキストを描画するのと同じ方法です。この一貫性には多くの利点がありますが、その中でも特に、心地よく調和のとれた外観があります。

また、を使用しTextRenderer.DrawTextている場合は、それをと組み合わせることも忘れないでください。これは、GDI+を使用して描画するTextRenderer.MeasureTextによって返される測定値とは異なるためです。Graphics.MeasureString

TextRenderer.DrawTextとの違いの詳細については、この質問Graphics.DrawStringへの回答を参照してください。印刷用に予約し、画面上のすべての要素に使用する必要があります。Graphics.DrawStringTextRenderer.DrawText

于 2012-07-26T14:46:17.777 に答える
3

次のようなものはどうですか:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    using (Font normal = new Font("Tahoma", 10, FontStyle.Regular))
    using (Font bold = new Font("Tahoma", 10, FontStyle.Bold))
    using (StringFormat format = 
        (StringFormat)StringFormat.GenericTypographic.Clone())
    {
        format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
        Rectangle temp = ClientRectangle;

        DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "AB", normal);
        DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "CDE ", bold);
        DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "FG", normal);
    }
}

void DrawString(Graphics g, Brush brush, ref Rectangle rect, StringFormat format, string text, Font font)
{
    using (StringFormat copy = (StringFormat)format.Clone())
    {
        copy.SetMeasurableCharacterRanges(new CharacterRange[] {
        new CharacterRange(0, text.Length)});
        Region[] regions = g.MeasureCharacterRanges(text, font, rect, copy);

        g.DrawString(text, font, brush, rect, format);

        int width = (int)(regions[0].GetBounds(g).Width);
        rect.X += width;
        rect.Width -= width;
    }
}

ここから取得します

于 2013-07-04T23:17:17.417 に答える