2011-05-24 28 views
0

使用Windows窗体,我有一个rectangle,我想在其中使用Graphics.DrawString来绘制一些文本。我想要做的是尽可能大地创建字体,同时将文本保留在矩形的范围内,并仅将文本包装到单词之间的下一行。Windows窗体动态调整文本的大小以适合矩形

例如

Not acceptable  Acceptable 

    +-------+   +--------+ 
    | dotne |   |  | 
    | t |   | dotnet | 
    | rocks |   | rocks | 
    +-------+   +--------+ 
半伪代码

,这就是我所想的

string text = "This is some Text"; 
StringFormat sf = new StringFormat(); 
sf.Alignment = StringAlignment.Center; 
sf.LineAlignment = StringAlignment.Center; 
RectangleF rect = new RectangleF(0,0,100,100); 
float maxFontSize = 10F; 
float minFontSize = 6F; 
float fontSize = maxFontSize; 
Font font = new Font(fontFamily, fontSize); 
bool found = false; 
do 
{ 
    font = new Font(fontFamily, fontSize); 
    if TextFitsWithinBounds(text, font, rect, sf) 
     found = true; 
    else 
     fontSize -= 0.1F; 
} while (found == false && fontSize > minFontSize) 
Graphics.DrawString(text, font, Brushes.Black, rect, sf); 

什么我要找的是实现TextFitsWithinBounds的手段()。框架中的任何地方是否有类可以帮助我实现这一目标?

MeasureString接近,但似乎不允许我指定边界。

+0

再次参考我以前的工作,我会建议你做你想做的事情。我的第一个版本的应用程序完全是你在做什么 - 触摸屏按钮上的自我增长文本。然而,从两个角度来看,它并不能很好地工作 - 它在文字包装方面存在问题,而且它的外观也不好。相反,我会为您提供一些不错的小字体,并且始终以相同的字符大小格式化文本。它会更好看,相信我。 – 2011-05-24 10:25:00

+0

@丹尼尔:谢谢,我当然没有从我以前的问题中驳回你的想法,事实恰恰相反,但现在,我只是试图为客户敲定一个快速的概念证明,而我却没有有时间重新创建Windows 7可以通过按钮为我提供的视觉样式。当我们超越POC时,我肯定会再次访问,并且几乎肯定会使用您描述的方法。如果我有更多的时间,我会接受你对我以前的问题的答案,但现在这是一个在外观和时间之间的折衷。 – Bryan 2011-05-24 10:43:07

回答

1

该图形对象具有.MeasureString()成员,从而导致绘制文本的大小。

+0

我试过MeasureString,但似乎不允许我指定边界的大小,而是它似乎计算边界的大小,没有任何方式指定我工作的约束。 – Bryan 2011-05-24 10:09:15

+0

再次想到,MeasureString有一个重载,允许这个。 http://msdn.microsoft.com/en-us/library/957webty.aspx – Bryan 2011-05-24 10:23:36

+1

@Bryan:从你的例子看,你在外循环中做'约束'。实现TextFitsWithinBounds应该与使用MeasureString一样简单,然后查看结果矩形是否大于您作为参数发送的您的矩形:) – 2011-05-24 10:26:19

相关问题