Top / .NET備忘録 / 08.Label / 04.表示可能な文字数の違い

フォントを大きくするとよくわかるのですが、VB6.0 と VB.NET では表示できる文字数に違いがあります。(左がVB6.0, 右が.NET))

Label.png

そもそも VB6.0 のラベルはウインドウを持っておらず、親コントロールに直接描画しているので、まったく別物といってもいいのですが、文字列を自分で描画することで近い形にすることができます。

    public new event PaintEventHandler Paint = null;

    protected override void OnPaint(PaintEventArgs e) {
        Rectangle face = this.ClientRectangle;
        if (BorderStyle != System.Windows.Forms.BorderStyle.None) {
            face = Rectangle.Inflate(face, -1, -1);
        }
        TextFormatFlags flags = CreateTextFormatFlags();
        Color foreColor = this.GetEnabledInternal() ? ForeColor : SystemColors.GrayText;
        TextRenderer.DrawText(e.Graphics, Text, Font, face, foreColor, flags);
        if (Paint != null) Paint(this, e);
    }

    protected virtual TextFormatFlags CreateTextFormatFlags() {
        TextFormatFlags flags = TextFormatFlags.NoPadding;
        flags |= ToTextFormatFlags(RtlTranslateAlignment(this.TextAlign));
        if (AutoEllipsis) {
            flags |= TextFormatFlags.EndEllipsis;
        } else {
            flags |= TextFormatFlags.WordBreak;
        }
        if (RightToLeft == System.Windows.Forms.RightToLeft.Yes) {
            flags |= TextFormatFlags.RightToLeft;
        }
        if (!UseMnemonic) {
            flags |= TextFormatFlags.NoPrefix;
        }
        return flags;
    }

    protected virtual TextFormatFlags ToTextFormatFlags(ContentAlignment align) {
        switch (align) {
            case ContentAlignment.BottomCenter:
                return TextFormatFlags.Bottom | TextFormatFlags.HorizontalCenter;
            case ContentAlignment.BottomLeft:
                return TextFormatFlags.Bottom | TextFormatFlags.Left;
            case ContentAlignment.BottomRight:
                return TextFormatFlags.Bottom | TextFormatFlags.Right;
            case ContentAlignment.TopCenter:
                return TextFormatFlags.Top | TextFormatFlags.HorizontalCenter;
            case ContentAlignment.TopLeft:
                return TextFormatFlags.Top | TextFormatFlags.Left;
            case ContentAlignment.TopRight:
                return TextFormatFlags.Top | TextFormatFlags.Right;
            case ContentAlignment.MiddleCenter:
                return TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter;
            case ContentAlignment.MiddleLeft:
                return TextFormatFlags.VerticalCenter | TextFormatFlags.Left;
            case ContentAlignment.MiddleRight:
                return TextFormatFlags.VerticalCenter | TextFormatFlags.Right;
            default:
                throw new InvalidEnumArgumentException();
        }
    }

GetEnabledInternal メソッドについては、こちら を参照してください。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2016-10-11 (火) 13:25:37 (430d)