我想把一个字串,自适应打印到一个固定的大小之中,不许换行,寻求帮助
例如:
字串"ABCDabcd1234"
打印到一个高度20, 宽度 50 ,必须自适应这个大小,也就是高度达到20,宽度达到50,并且不换行或者只适应一项。例如宽度限制在50,高度比20小;或者高度20,宽度比50小如果有不理解的地方,请留言

解决方案 »

  1.   

    图片打印的话,打印精度不是很好,针对高度的控制,我可以使用
    _hF = new Font("Times New Roman", (float)mHeight / (float)1.77069759, FontStyle.Regular);
    这里(float)mHeight / (float)1.77069759算出字符在这个高度下的字号
      

  2.   

    宽度不好控制,例如下面是10号字体的字符高度和宽度信息mFontSize
    {Width = 14.9536133 Height = 17.7069759}
        Height: 17.7069759
        IsEmpty: false
        Width: 14.9536133 A字符的宽度
    mFontSize
    {Width = 10.972765 Height = 17.7069759}
        Height: 17.7069759
        IsEmpty: false
        Width: 10.972765 a字符的宽度
    mFontSize
    {Width = 13.3666992 Height = 17.7069759}
        Height: 17.7069759
        IsEmpty: false
        Width: 13.3666992 L字符的宽度
    mFontSize
    {Width = 8.599175 Height = 17.7069759}
        Height: 17.7069759
        IsEmpty: false
        Width: 8.599175 l字符的宽度(字符l)
    mFontSize
    {Width = 11.7797852 Height = 17.7069759}
        Height: 17.7069759
        IsEmpty: false
        Width: 11.7797852 1字符的宽度(数字1)
      

  3.   

    可以使用逼近法,使用默认的字体,然后看是否能填充你的宽度,然后进行匹配逼近类似DIP算法
      

  4.   

    我举一个简单的例子,在一个Panel中实现,这个例子中假定panel1就是你的目标区域,你领会了这种思路在代码中不难转化成实际的打印代码(用这种方式无论目标区域是局部还是全部,都可以实现那种Excel中所谓的缩小字体自动填充,甚至"可以放大字体自动填充",如果应用于局部,需要用代码中一个叫scale的变量去计算区域的Location)
    private void panel1_Paint(object sender, PaintEventArgs e)
            {
                string text = "MessageBox";
                SizeF textSize=e.Graphics.MeasureString(text, this.Font);
                Size areaSize = this.panel1.Size;
                float hScale = areaSize.Width / textSize.Width;
                float vScale = areaSize.Height / textSize.Height;
                float scale = hScale > vScale ? vScale : hScale;
                e.Graphics.ScaleTransform(scale, scale);
                e.Graphics.DrawString(text, this.Font, Brushes.Red, this.panel1.ClientRectangle);
            }