我创建了一个布尔代数简化器。为此,我在简化过程中的关键阶段使用了该表达式,将其添加到列表中,最后使用这些表达式来说明计算机如何简化该表达式。例如。对于B•(A+~A)
,标签的内容为:
B•(A+~A) // Initial Expression
= B•(1) // Brackets simplified
= B•1 // Brackets removed
= B // Simplified expression.
我创建了一个标准面板,并将标签拖放到其中,以将标签停靠在面板中。
我想这样做,以便更改文本的字体大小,使其完全适合面板,因为某些复杂的表达式可能需要很多行,因此可能不适合屏幕。
但是,如果用户输入了一个非常简单的表达式,例如A+1
,答案和工作范围将很小。在这种情况下,我不希望文本填充面板,因为字体会很大。
因此,我试图这样做,以便更改Label的字体大小以使表达式适合面板,但限制最大字体大小,以便少量文本不使用大量字体。
有人知道怎么做吗?
我在网上搜索并找到了以下代码,但这未填充面板:
WorkingOutLabel.Font = new Font(WorkingOutLabel.Font.FontFamily,
PanelHoldingWorkingLabel.Font.Height, FontStyle.Regular);
答案 0 :(得分:1)
从Label派生的自定义控件,可缩放其文本大小以适合控件的边界。
当Text的计算宽度大于控件的ClientArea时,将应用Graphics.ScaleTransform()转换。
调整控件大小和/或更改文本时,将缩放文本。
示例功能:
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;
[DesignerCategory("Code")]
class AutoScaleLabel : Label
{
public AutoScaleLabel() => InitializeComponent();
private void InitializeComponent()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.ResizeRedraw, true);
this.UpdateStyles();
}
protected override void OnLayout(LayoutEventArgs e)
{
base.OnLayout(e);
this.AutoSize = false;
}
protected override void OnPaint(PaintEventArgs e)
{
using (SolidBrush brush = new SolidBrush(this.ForeColor))
using (StringFormat format = new StringFormat(StringFormatFlags.NoClip |
StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox))
{
format.Trimming = StringTrimming.None;
SizeF textSize = e.Graphics.MeasureString(this.Text, this.Font, this.ClientSize, format);
if (textSize.Width > this.ClientSize.Width)
{
float scale = (float)this.ClientSize.Width / textSize.Width;
e.Graphics.ScaleTransform(scale, scale);
}
e.Graphics.Clear(this.BackColor);
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
e.Graphics.DrawString(this.Text, this.Font, brush, this.ClientRectangle, format);
}
}
}