进度条的颜色无法改变 c#

4

我的需求是在点击按钮时将进度条的颜色更改为红色。我不想注释掉Application.EnableVisualStyles()。

因此,我尝试使用SendMessage。我的代码如下:

    [DllImport("user32.dll")]
    private static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);

    private const Int32 WM_USER = 0x0400;
    private const Int32 CCM_FIRST = 0x2000;
    private const Int32 PBM_SETBARCOLOR = WM_USER + 9;
    private const Int32 PBM_SETBKCOLOR = CCM_FIRST + 1;

    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            SendMessage(this.progressBar1.Handle, PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(Color.Red));
            SendMessage(this.progressBar1.Handle, PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(Color.Red));
            progressBar1.Style = ProgressBarStyle.Continuous;
            progressBar1.Value = progressBar1.Maximum;
        });
    }

它不起作用。我不知道为什么。你能帮忙吗?

1个回答

7
如果你想将 ProgressBar 的颜色从初始的 绿色 改为 红色(这是一个 标准状态 ),你可以简单地执行以下操作:

https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb760850(v=vs.85).aspx

  // 1040 - PBM_SETSTATE
  // 1 - green  (in progress) 
  // 2 - red    (error)
  // 3 - yellow (paused), 
  SendMessage(progressBar1.Handle, 1040, 2, 0);

实现方式:
  this.Invoke(() => {
    progressBar1.Value = progressBar1.Maximum;
    progressBar1.Style = ProgressBarStyle.Continuous;

    SendMessage(progressBar1.Handle, 1040, 2, 0); 
  });

1
这里只是一个小修正。1 似乎是绿色的值,而不是0。 - Broots Waymb
1
@DangerZone:你说得很对,发现得好:PBST_NORMAL = 0x0001; /* 绿色 */;但是,如果值超出了[1..3]范围,将使用绿色。我已经编辑了答案。 - Dmitry Bychenko
1
你确定是这样吗?我写了一个小测试应用程序来在不同的颜色之间切换(以测试它在更大的程序中的工作方式),如果超出[1..3],它似乎会保留当前颜色。 - Broots Waymb
@DangerZone:你说得很对;看来我非常需要更多的咖啡了;希望这只是一种学术上的问题,因为坚持文档中规定的 [1..3] 范围是最好的策略。 - Dmitry Bychenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接