0

使用选项 TextRenderingHint.ClearTypeGridFit 的 Tahoma 字体绘制的标签是使用 AutoSize 的问题。没有 ClearTypeGridFit 它看起来不错,但是 - 它被父容器裁剪(见附图:在第一个标签上,','被裁剪)

我发现它只有 Tahoma 字体。

自定义标签代码:

class CustomLabel: Label
{
    public CustomLabel ()
        :base()
    {
    }

    protected override void OnPaint ( PaintEventArgs e )
    {
        e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
        base.OnPaint( e );            
    }
}

设计器文件中的代码和平:

        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.label1.Font = new System.Drawing.Font( "Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( (byte)( 0 ) ) );
        this.label1.Location = new System.Drawing.Point( 54, 95 );
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size( 35, 13 );
        this.label1.TabIndex = 1;
        this.label1.Text = resources.GetString( "label1.Text" );
        // 
        // customLabel1
        // 
        this.customLabel1.AutoSize = true;
        this.customLabel1.BackColor = System.Drawing.Color.NavajoWhite;
        this.customLabel1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.customLabel1.Font = new System.Drawing.Font( "Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( (byte)( 0 ) ) );
        this.customLabel1.ForeColor = System.Drawing.Color.Black;
        this.customLabel1.Location = new System.Drawing.Point( 1, 1 );
        this.customLabel1.Margin = new System.Windows.Forms.Padding( 0 );
        this.customLabel1.Name = "customLabel1";
        this.customLabel1.Size = new System.Drawing.Size( 192, 154 );
        this.customLabel1.TabIndex = 0;
        this.customLabel1.Text = resources.GetString( "customLabel1.Text" );

在此处输入图像描述

我发现只是一个被覆盖的 GetPreferedSize 函数:

    public override Size GetPreferredSize ( Size theProposedSize )
    {            
        if ( TextRendering == TextRenderingHint.ClearTypeGridFit )
        {
            Graphics aGraphics = Graphics.FromHwnd( this.Handle );
            if ( aGraphics != null )
            {
                aGraphics.TextRenderingHint = theTextRendering;
                Size aResult = TextRenderer.MeasureText( aGraphics, Text, Font, theProposedSize );
                //apply control minimum size
                aResult.Height = Math.Max( aResult.Height, MinimumSize.Height );
                aResult.Width = Math.Max( aResult.Width, MinimumSize.Width );
                return aResult;
            }
        }

        return base.GetPreferredSize( theProposedSize );
    }

但我不能对结果应用最大尺寸。为什么我需要最大尺寸?例如,我希望有可能按宽度限制标签。

有任何想法吗?

4

1 回答 1

0

所以,我的最终解决方案是这样的:

    public override Size GetPreferredSize ( Size theProposedSize )
    {
        if ( SystemInfo.WinVersion == SystemInfo.Version.WindowsXP )
        {
            if ( theTextRendering == TextRenderingHint.ClearTypeGridFit )
            {
                Graphics aGraphics = Graphics.FromHwnd( this.Handle );
                if ( aGraphics != null )
                {
                    aGraphics.TextRenderingHint = theTextRendering;
                    Size aResult = TextRenderer.MeasureText( aGraphics, Text, Font, theProposedSize );
                    //apply padding and margin
                    aResult.Width += Margin.Horizontal + Padding.Horizontal;
                    aResult.Height += Margin.Vertical + Padding.Vertical;
                    //apply control minimum size
                    aResult.Height = Math.Max( aResult.Height, MinimumSize.Height );
                    aResult.Width = Math.Max( aResult.Width, MinimumSize.Width );

                    //adopt maximum width
                    if ( MaximumSize.Width > 0 )
                    {
                        while ( aResult.Width > MaximumSize.Width )
                        {
                            aResult.Width -= MaximumSize.Width;
                            aResult.Height += Font.Height;
                            if ( aResult.Width < MaximumSize.Width )
                            {
                                aResult.Width = MaximumSize.Width;
                            }
                        }
                    }

                    return aResult;
                }
            }
        }

        return base.GetPreferredSize( theProposedSize );
    }
于 2011-12-21T07:00:15.120 回答