2009-10-30 58 views
3

我使用Graphics.DrawString吸引我的用戶的文字是這樣的:如何用GDI強調多行文本的某些部分?

protected override void OnPaint(PaintEventArgs e) 
{ 
    RectangleF bounds = DisplayRectangle; 
    bounds.Inflate(-4, -4); // Padding 
    StringFormat format = new StringFormat(); 
    format.Alignment = StringAlignment.Near; 
    format.LineAlignment = StringAlignment.Near; 
    format.Trimming = StringTrimming.None; 
    using (Brush bFore = new SolidBrush(ForeColor)) 
    { 
     g.DrawString(Text, Font, bFore, bounds, format); 
    } 
} 

如果控制的TextDisplayRectangle更寬,DrawString很好地打破了Text成多行的字邊界。

現在我想從Text中劃下一些單詞,但我無法解決這個問題。我試着拆分Text,然後MeasureString這個字符串剛好在一個下劃線部分開始,DrawString正常部分,然後DrawString下劃線部分。但是,只有當Text是單行時纔有效。

我相信使用一個孩子LinkLabelRichTextBox呈現在我的控制的文本將解決這個問題,但我不喜歡使用一個子控件只是強調了幾句話的想法。有另一種方法嗎?

回答

3

這是一個粗略的例子,它將使用字符串拆分成部分和兩種不同的字體樣式,而不是單獨繪製下劃線(儘管這也可以)。在實際操作中,我會建議按文字而不是短語分割文本,並在循環中分別處理每個單詞。否則,就像在這個例子中那樣,換行並不正確。

Dim fntNormal As New Font(myFontFamily, myFontSize, FontStyle.Regular, GraphicsUnit.Pixel) 
    Dim fntUnderline As New Font(myFontFamily, myFontSize, FontStyle.Underline, GraphicsUnit.Pixel) 

    g.DrawString("This is ", fntNormal, Brushes.Black, rctTextArea) 
    w1 = g.MeasureString("This is ", fntNormal).Width 
    w2 = g.MeasureString("underlined", fntUnderline).Width 
    If w1 + w2 > rctTextArea.Width Then 
    yPos = rctTextArea.Y + g.MeasureString("This is ", fntNormal).Height + 5 
    xPos = rctTextArea.X 
    Else 
    yPos = rctTextArea.Y 
    xPos = 0 
    End If 

    g.DrawString("underlined", fntUnderline, Brushes.Black, xPos, yPos) 

    w1 = g.MeasureString("underlined", fntUnderline).Width 
    w2 = g.MeasureString(", and this is not.", fntNormal).Width 

    If w1 + w2 > rctTextArea.Width Then 
    yPos += g.MeasureString("underlined", fntUnderline).Height + 5 
    xPos = rctTextArea.X 
    Else 
    xPos = 0 
    End If 


    g.DrawString(", and this is not.", fntNormal, Brushes.Black, xPos, yPos) 

這段代碼真的可以清理乾淨,讓您循環遍歷文本字符串中的每個單詞。

本示例還不包含任何代碼來檢查您是否超出了邊界矩形的垂直極限。

對不起,VB代碼,我只是注意到你的問題是在C#中。

+0

上面兩行xPos = 0。他們不應該是xPos = xPos + w1嗎? –

+0

謝謝,我想這是我能做的最好的。我也嘗試在單詞邊界上使用MeasureCharacterRanges,但它似乎不適用於多行文本。 –

+0

是的,xPos = 0是錯誤的。我的剪切和粘貼過於匆忙。 :) – Stewbob

相關問題