.NET Winforms Текст вертикальной панели прогресса

Недавно мне понадобился вертикальный индикатор выполнения для моей заявки на выигрышные формы. Производный класс, как показано ниже. Мне также нужно добавить текст на индикатор выполнения. Ярлык на нем не работает из-за проблем с прозрачностью. После некоторых исследований я нашел кое-что. Но проблема в том, что индикатор выполнения находится в вертикальном положении, а текст на нем выглядит горизонтальным. Мне тоже нужно вертикальное. Как я могу это сделать?

Благодарю.

public class VProgressBar : ProgressBar
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= 0x04;

            if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6)
            {
                cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
            }

            return cp;
        }
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == 0x000F)
        {
            using (Graphics graphics = CreateGraphics())
            using (SolidBrush brush = new SolidBrush(ForeColor))
            {
                SizeF textSize = graphics.MeasureString(Text, Font);
                graphics.DrawString(Text, Font, brush, (Width - textSize.Width) / 2, (Height - textSize.Height) / 2);
            }
        }
    }

    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;
            Refresh();
        }
    }

    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    public override Font Font
    {
        get
        {
            return base.Font;
        }
        set
        {
            base.Font = value;
            Refresh();
        }
    }
}

1 ответ

Решение

Вам нужно использовать StringFormat, чтобы нарисовать строку по вертикали, используя флаг. Попробуйте следующее в вашем WndProc метод:

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == 0x000F)
        {
            using (Graphics graphics = CreateGraphics())
            using (SolidBrush brush = new SolidBrush(ForeColor))
            {
                StringFormat format = new StringFormat(
                       StringFormatFlags.DirectionVertical);

                SizeF textSize = graphics.MeasureString(Text, Font);
                graphics.DrawString(
                     Text, Font, brush, 
                     (Width / 2 - textSize.Height / 2),
                     (Height / 2 - textSize.Width / 2),
                     format);
            }
        }
    }
Другие вопросы по тегам