2012-07-26 61 views
3

早上好。使抽繩部分加粗

我已經創建了一個自定義的treeview控件,在屏幕上繪製一個正常的樹形視圖以及其他各種東西。在繪畫事件期間,我使用以下方法將node.text字符串繪製到樹視圖控件。

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

基本上,我試圖做的是使node.text斜體的一部分,所以它呈現在屏幕上,像這樣......

AB*CDE*FG 

個人而言,我會在這樣一個接近本它有效地繪製三個不同的字符串......兩個非斜體和一個斜體,但是這需要額外的定位。

我希望有可能有效地協調字體格式的字符串,然後把它作爲第一個參數放在drawstring中,這實際上是可能的嗎?如果是的話,我會怎麼做,或者有沒有任何資源可以幫助我。

我使用的WinForms,和VisualBasic的.NET Framework 3.5(前面提到的unfortuantly非是可以改變的,因爲它是一個工作的項目,這是該軟件是專門針對環境)我希望

回答

2

可以有效地合併字體格式化的字符串,然後將其作爲第一個參數放在drawstring中,這實際上可能嗎?

不,這是不可能的。 DrawString函數將使用您指定的格式標誌來繪製您指定的所有文本。這是一件全有或無關的事情。

如果您想將某些部分設爲粗體而其他部分不是,則需要對DrawString函數進行多次調用。有一些額外的定位涉及到完成,但它不應該太困難。只有x座標正在改變; y座標應該保持不變。除非你喜歡改變字體,如,然後your baselines will get messed up and you will have to compensate for that to prevent the result from looking like an ugly mismatch


除此之外,請允許我建議您使用TextRenderer.DrawText function而不是Graphics.DrawString函數。前者的優點在於它使用GDI繪製文本,這與內置的本地控件繪製文本的方式相同。這種一致性有許多優點,其中最重要的一點是令人愉悅和諧的視覺效果。

如果你正在使用TextRenderer.DrawText,你還需要確保你有TextRenderer.MeasureText結合起來,因爲測量將是由那些Graphics.MeasureString返回,吸引使用GDI +不同。

有關TextRenderer.DrawTextGraphics.DrawString之間的區別的更多信息,請參閱this question的答案。 Graphics.DrawString應該保留用於打印,並且TextRenderer.DrawText應該用於所有屏幕元素。

+0

我猜想,這是非常多的情況下,但是textrenderer.drawtext函數的大拇指:) – 2012-07-27 18:06:41

2

如何像:

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; 
    } 
} 

here獲得。