Использование комбинации Tahoma, TextRenderingHint.ClearTypeGridFit и AutoSize (WindowsXP) для элемента управления Label - PullRequest
0 голосов
/ 13 декабря 2011

Это проблема использования AutoSize для надписи, которая рисуется шрифтом Tahoma с опцией TextRenderingHint.ClearTypeGridFit. Без 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" );

enter image description here

То, что я нашел, просто переопределило функцию 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 );
    }

Но я не могу применить максимальный размер к результату. Зачем мне нужен максимальный размер? Например, я хочу иметь возможность ограничивать метки по ширине.

Есть идеи?

1 Ответ

0 голосов
/ 21 декабря 2011

Итак, мое окончательное решение выглядит так:

    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 );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...