2009-06-04 24 views
2

TextRenderer.MeasureTextに測定するテキストと使用する幅を指定すると、そのテキストを表示するのに必要な高さが返されます。TextRenderer.MeasureTextよりもスペースが必要なLinkLabelの場合

private static int CalculateHeight(string text, Font font, int width) 
{ 
    Size size = TextRenderer.MeasureText(text, font, new Size(width, Int32.MaxValue), TextFormatFlags.NoClipping | TextFormatFlags.WordBreak); 
    return size.Height; 
} 

私はそれが切り取ら何も提供し、幅と高さでテキストを表示するであろうにLinkLabelにそのテキスト、幅と高さを与える場合。

ただし、LinkLabel.LinksコレクションにLinkを配置すると、LinkLabelは文字間に少し間隔があるように見えるテキストを描画します。このとき、テキストの終わりがクリップされることがあります。これを防ぐためにとにかくありますか?私はリンクがあるときにパディングを追加しようとしましたが、どれくらいのスペースが必要になるか正確に知る信頼できる方法はありません。これを行う他の方法はありますか?

答えて

0

TextRenderer.MeasureTextは、DrawTextEx APIの管理ラッパーです。返される値はlprc構造体から返されます。詳細については、そのAPIを参照してください。

+0

になります。正しい測定値を取得してからLinkLabelコントロールを使用する場合は、MeasureTextまたはDrawTextExのいずれかを使用する必要があります。テキストはリンクとして表示されますが、そのようなものはありません。私が質問で言ったように、テキストが純粋なテキストとしてのみ表示される場合、MeasureTextは正常に動作します。 –

+0

LinkLabelでAutoSizeを有効にしていますか? –

+0

いいえ、私はしません... –

0

私は下線を引くスタイルを削除することができたと思います。 linkLabel.Styles.Add("text-decoration", "none");しかし、それはもちろんリンクのようには見えません。 :/

もう1つ解決策は、私が推測するようにパディングを追加することです。

int heightBefore = linkLabel.Height; 
int fontHeight = CalculateHeight(linkLabel.Text, linkLabel.Font, linkLabel.Width); 
int paddingHeight = heightBefore - fontHeight; 
linkLabel.Font = otherFont; 
linkLabel.Height = CalculateHeight(linkLabel.Text, otherFont, linkLabel.Width); 
linkLabel.Height += paddingHeight; 

解決策の中で最も美しいものではありませんが、私はそれがうまくいくと思います。

1

LinkLabelに複数のリンクが含まれている場合、またはリンクに含まれないテキストの部分がある場合は、TextRenderer.DrawText/MeasureTextの代わりにGraphics.DrawString/MeasureStringを使用します。あなたは簡単にレンダリングの最大の違いは、小さなLの文字である、アクションでそれを見ることができます:

linkLabel1.Text = new string('l', 100); // 100 x small L 
linkLabel1.LinkArea = new LinkArea(0, 50); 
linkLabel2.Text = new string('l', 100); // 100 x small L 
+0

いいえ、DrawStringはUseCompatibleTextRenderingがオンの場合のみ使用されます。 –

+0

申し訳ありませんが、あなたは正しくありません。次のコードを参照してください。 linkLabel1.Text = new string( 'l'、100); // 100 x small L linkLabel1.LinkArea = new LinkArea(0、50); linkLabel2.Text =新しい文字列( 'l'、100); // 100 x small L – LukeSw

+0

通常のLabelsとLinkLabelsをテストするときは、私のテストアプリケーションで提案が機能しましたが、実際のアプリケーションでは、Control.GetPreferredSizeメソッドだけが機能していました。 –

関連する問題