Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Winforms垂直进度条文本_C#_.net_Winforms_Wndproc_Createparams - Fatal编程技术网

C# .NET Winforms垂直进度条文本

C# .NET Winforms垂直进度条文本,c#,.net,winforms,wndproc,createparams,C#,.net,Winforms,Wndproc,Createparams,最近,我的win forms应用程序需要一个垂直进度条。派生类如下所示。我还需要在进度条上添加文本。因为透明性问题,上面的标签不起作用。经过一些研究,我发现了一些东西。但问题是,虽然进度条是垂直的,但其上的文本看起来是水平的。我也需要垂直的。我该怎么做 谢谢 public class VProgressBar : ProgressBar { protected override CreateParams CreateParams { get {

最近,我的win forms应用程序需要一个垂直进度条。派生类如下所示。我还需要在进度条上添加文本。因为透明性问题,上面的标签不起作用。经过一些研究,我发现了一些东西。但问题是,虽然进度条是垂直的,但其上的文本看起来是水平的。我也需要垂直的。我该怎么做

谢谢

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();
        }
    }
}
您需要使用来垂直绘制字符串,使用标志。在
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);
            }
        }
    }

看看这个问题的老答案-谢谢Daniel,它成功了。我还需要使用graphics.RotateTransform(180)从下到上显示文本。