Как изменить цвет progressbar в.NET C# 3.5?

a находится в глобальном масштабе, поэтому он инициализирован как 0.

(Действительно, если бы он был объявлен в функции, он не был бы инициализирован, и поведение вашей программы было бы неопределенным.)

84
задан Joel Coehoorn 9 June 2009 в 19:28
поделиться

9 ответов

Since the previous answers don't appear to work in with Visual Styles. You'll probably need to create your own class or extend the progress bar:

public class NewProgressBar : ProgressBar
{
    public NewProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle rec = e.ClipRectangle;

        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        if(ProgressBarRenderer.IsSupported)
           ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(Brushes.Red, 2, 2, rec.Width, rec.Height);
    }
}

EDIT: Updated code to make the progress bar use the visual style for the background

78
ответ дан 24 November 2019 в 08:24
поделиться

Предлагаю вам также взглянуть на эту статью о CodeProject: Progress-O-Doom . Это великолепно!

2
ответ дан 3 July 2019 в 09:48
поделиться

Редактировать: за два минуты мне потребовалось запустить противоборство и проверить синтаксис, который я побил, с гораздо лучшими ответами. Мне нравится этот сайт.

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;
-5
ответ дан 24 November 2019 в 08:24
поделиться

РЕДАКТИРОВАТЬ

По звукам вещей вы используете тему XP, у которой есть прогбар на основе зеленых блоков. Попробуйте перевернуть ваш стиль пользовательского интерфейса в Windows Classic и протестировать снова, но вам может потребоваться реализовать собственное событие OnPaint, чтобы заставить его выполнять то, что вы хотите, во всех стилях пользовательского интерфейса

Или, как кто-то другой указал, отключите VisualStyles для своего приложения. .

Оригинал

Насколько я знаю, рендеринг индикатора выполнения происходит в соответствии с выбранным стилем темы Windows (win2K, xp, vista)

Вы можете изменить цвет, установив свойство

ProgressBar.ForeColor

Я не уверен, что вы можете сделать гораздо больше, однако ...

делает некоторое гугление

Здесь есть статья из MS KB о создании «гладкой» индикатора выполнения

http: // support.microsoft. com / kb / 323116

2
ответ дан 24 November 2019 в 08:24
поделиться

Обычно индикатор выполнения является либо тематическим, либо учитывает цветовые предпочтения пользователя. Поэтому для изменения цвета вам нужно либо отключить визуальные стили и установить ForeColor , либо нарисовать элемент управления самостоятельно.

Что касается непрерывного стиля, то вместо блоков вы можете установить стиль свойство:

pBar.Style = ProgressBarStyle.Continuous;
3
ответ дан 24 November 2019 в 08:24
поделиться

В конструкторе вам просто нужно установить свойство ForeColor в любой цвет, который вы хотите. В случае с красным для него есть предопределенный цвет.

Чтобы сделать это в коде (C #), сделайте это:

pgs.ForeColor = Color.Red;

Редактировать : О да, также установите Стиль на непрерывный. В коде, например:

pgs.Style = System.Windows.Forms.ProgressBarStyle.Continuous;

Другое редактирование: Вам также необходимо удалить строку, которая читает Application.EnableVisualStyles () из вашего Program.cs (или аналогичный). Если вы не можете сделать это, потому что хотите, чтобы у остальной части приложения были визуальные стили, тогда я бы предложил нарисовать элемент управления самостоятельно или перейти к WPF, так как с WPF это легко сделать. Вы можете найти руководство по рисованию индикатора выполнения на codeplex

27
ответ дан 24 November 2019 в 08:24
поделиться

попробуйте использовать сообщение PBM_SETBARCOLOR, которое должно помочь с SendMessage

См. http://www.vbforums.com/showthread.php?t=248721 для пример.

2
ответ дан 24 November 2019 в 08:24
поделиться

Модификация к ответу Дыбурвелла. (У меня недостаточно репутации, чтобы отредактировать его самому.) Как и его ответ, он работает с включенными «Визуальными стилями». Вы можете просто установить свойство ForeColor индикатора выполнения в любом представлении дизайна формы.

using System;
using System.Windows.Forms;
using System.Drawing;

public class ProgressBarEx : ProgressBar
{
    private SolidBrush brush = null;

    public ProgressBarEx()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (brush == null || brush.Color != this.ForeColor)
            brush = new SolidBrush(this.ForeColor);

        Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
        if (ProgressBarRenderer.IsSupported)
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rec);
        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);
    }
}
14
ответ дан 24 November 2019 в 08:24
поделиться

Я просто поместил это в статический класс.

  const int WM_USER = 0x400;
  const int PBM_SETSTATE = WM_USER + 16;
  const int PBM_GETSTATE = WM_USER + 17;

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
  static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

  public enum ProgressBarStateEnum : int
  {
   Normal = 1,
   Error = 2,
   Paused = 3,
  }

  public static ProgressBarStateEnum GetState(this ProgressBar pBar)
  {
   return (ProgressBarStateEnum)(int)SendMessage(pBar.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero);
  }

  public static void SetState(this ProgressBar pBar, ProgressBarStateEnum state)
  {
   SendMessage(pBar.Handle, PBM_SETSTATE, (IntPtr)state, IntPtr.Zero);
  } 

Надеюсь, это поможет,

Марк

5
ответ дан 24 November 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: