【问题标题】:How to fill panel background color based on dynamic value [closed]如何根据动态值填充面板背景颜色
【发布时间】:2020-01-25 22:57:44
【问题描述】:

我正在使用 C# 开发一个桌面应用程序,该应用程序需要使用动态值填充面板背景。例如,如果面板的宽​​度为 200 像素并且进度属性当前达到 50%,那么面板的 100 像素应该是绿色的剩下的 100px 的颜色会保持原样。

【问题讨论】:

  • 我确实尝试过不同的 panel_paint 事件,但没有成功
  • 使用 ProgressBar 肯定会更容易(Aero 知道进度条是什么,所以它会适当地为其设置动画等)?如果您不顾一切地自己动手,就不会画我自己的矩形;我只需在第一个面板中添加另一个面板,停靠在左侧,宽度 = 200 * 50/100,使新面板的背景颜色变为绿色,并随着进度的发生改变其宽度
  • 我确实尝试过不同的 panel_paint 事件,但没有成功 我们该怎么做?油漆是正确的事件;显示你的代码!!!您可以通过调用 panel.Invalidate() 从任何进展或注意到的地方触发它。您使用 e.Graphics.FillRectangle(Brushes.Green) 填充一个矩形并将背景色设置为 Color.Red。做双缓冲面板!! - 如果使用两个面板,或者使用 Caius 的建议!
  • @CaiusJard 实际上,我确实尝试过您关于使用进度条的想法,但不幸的是,使用进度条会带来使用不同颜色的挑战。虽然面板内的面板是我要尝试的。
  • 我们必须查看您的绘制代码才能为您提供帮助。

标签: c# winforms desktop-application


【解决方案1】:

这是一个完成这项工作的简单控件

public partial class ProgressPanel : Panel
{
    private float m_progress = 0;
    private Color m_progressColor = Color.Green;
    public ProgressPanel()
    {
        InitializeComponent();
    }

    /// <summary>
    /// the progress value is between 0 & 100 inclusively
    /// </summary>
    public float Progress
    {
        get
        {
            return m_progress;
        }
        set
        {
            m_progress = value;
            this.Invalidate();
        }
    }

    public Color ProgressColor
    {
        get
        {
            return m_progressColor;
        }
        set
        {
            m_progressColor = value;
            this.Invalidate();
        }
    }

    private void ProgressPanel_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.Clear(BackColor);

        e.Graphics.FillRectangle(new SolidBrush(ProgressColor), new Rectangle(new Point(), new Size((int)(Width * Progress / 100), Height)));
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // ProgressPanel
        // 
        this.Paint += new System.Windows.Forms.PaintEventHandler(this.ProgressPanel_Paint);
        this.ResumeLayout(false);

    }
}

只需在您的项目中创建一个新的空类并将其命名为ProgressPanel,然后将上述代码复制到其中。

现在您可以使用新创建的ProgressPanel,就像使用设计器中的任何其他控件一样

请注意,此示例是一个简化示例。 您可能会注意到一些闪烁,但除此之外它完全正常

如果您想知道如何将此示例升级为专业控件,我很乐意提供帮助

【讨论】:

  • 对不起,我已经修复了代码。
  • 谢谢伙计。是的,确实我不得不用 public 改变构造函数,但这确实像一个魅力。谢谢!
  • 别忘了也更改这一行e.Graphics.FillRectangle(new SolidBrush(ProgressColor), new Rectangle(new Point(), new Size((int)(Width * Progress / 100), Height)));
  • @NitinSingh 你应该处理你正在创建的画笔。
  • 编译器足够聪明,可以在您不再需要它时自动处理它
猜你喜欢
  • 2013-09-03
  • 1970-01-01
  • 2011-01-19
  • 2019-12-18
  • 2021-11-26
  • 2017-06-11
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多