【问题标题】:Show Text on ProgressBar in StatusStrip在 StatusStrip 的 ProgressBar 上显示文本
【发布时间】:2017-03-31 10:10:43
【问题描述】:

我是 Windows 编程 的新手。在 C# 中,我正在使用 Visual Studio 2017。现在,我遇到了一个问题。问题是,我试图在ProgressBar 中的StatusStrip 中显示一些文本(进度值),但找不到合适的工作方式来做到这一点。 :-(

谁能给我一些想法或解决这个问题的方法?我会很高兴和感谢你! 您的回答将不胜感激。 :-)

【问题讨论】:

    标签: c# .net winforms progress-bar statusstrip


    【解决方案1】:

    ToolStripProgressBar 组件使用ProgressBar 来显示进度,控件不显示文本。为了能够为控件呈现文本,您需要自己绘制值。为此,您可以创建一个源自ToolStripProgressBar 的自定义项。然后您可以使用NativeWindow 为控件的WM_PAINT 消息分配自定义代码:

    using System;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
    [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)]
    public class MyToolStripProgressBar : ToolStripProgressBar
    {
        public MyToolStripProgressBar() : base()
        {
            this.Control.HandleCreated += Control_HandleCreated;
        }
        private void Control_HandleCreated(object sender, EventArgs e)
        {
            var s = new ProgressBarHelper((ProgressBar)this.Control);
        }
    }
    public class ProgressBarHelper : NativeWindow
    {
        ProgressBar c;
        public ProgressBarHelper(ProgressBar progressBar)
        {
            c = progressBar;
            this.AssignHandle(c.Handle);
        }
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == 0xF /*WM_PAINT*/)
            {
                using (var g = c.CreateGraphics())
                    TextRenderer.DrawText(g, c.Value.ToString(),
                       c.Font, c.ClientRectangle, c.ForeColor);
            }
        }
    }
    

    【讨论】:

    • 如果我没记错的话,“不再建议将文本放在进度条内”。如果我错了,请纠正我。
    • @P.Pat 我认为满足要求没有任何问题。这是一个普遍的要求。
    • @P.Pat 是的,不推荐。它在 Windows 桌面应用程序设计指南中说明 →Progress Bars不要将完成百分比或任何其他文本放在进度条上。此类文本不可访问,并且与使用主题不兼容。不正确
    • 不客气。有时您可以从控件派生并覆盖它们的WndProc。有时您不希望或不能从控件派生,而只想扩展消息处理而不继承,在这种情况下,NativeWindow 就可以了。
    • 哇哦!我什至不知道你能做到这一点!在没有继承的情况下覆盖控件的 WndProc!?为令人敬畏而投票。
    【解决方案2】:
      progressBar1.CreateGraphics().DrawString(progressBar1.Value.ToString(), new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
    

    就在几天前,我遇到了同样的问题,并遇到了这段完美地完成工作的小代码:)
    this网站获取代码和解释

    【讨论】:

    • 我没有,您对此有意见吗?
    • 它会给你一个错误还是其他什么?你能展示一下你是如何嵌入它的吗?
    • 可能是我以错误的方式实现它。虽然我得到了解决方案。但我认为我必须在覆盖 OnPaint() 事件处理程序时使用您的代码。 :-) 感谢您的宝贵时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2010-09-09
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多