a
находится в глобальном масштабе, поэтому он инициализирован как 0
.
(Действительно, если бы он был объявлен в функции, он не был бы инициализирован, и поведение вашей программы было бы неопределенным.)
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
Предлагаю вам также взглянуть на эту статью о CodeProject: Progress-O-Doom . Это великолепно!
Редактировать: за два минуты мне потребовалось запустить противоборство и проверить синтаксис, который я побил, с гораздо лучшими ответами. Мне нравится этот сайт.
progressBar1 = new ProgressBar();
progressBar1.ForeColor = Color.Red;
РЕДАКТИРОВАТЬ
По звукам вещей вы используете тему XP, у которой есть прогбар на основе зеленых блоков. Попробуйте перевернуть ваш стиль пользовательского интерфейса в Windows Classic и протестировать снова, но вам может потребоваться реализовать собственное событие OnPaint, чтобы заставить его выполнять то, что вы хотите, во всех стилях пользовательского интерфейса
Или, как кто-то другой указал, отключите VisualStyles для своего приложения. .
Оригинал
Насколько я знаю, рендеринг индикатора выполнения происходит в соответствии с выбранным стилем темы Windows (win2K, xp, vista)
Вы можете изменить цвет, установив свойство
ProgressBar.ForeColor
Я не уверен, что вы можете сделать гораздо больше, однако ...
делает некоторое гугление
Здесь есть статья из MS KB о создании «гладкой» индикатора выполнения
Обычно индикатор выполнения является либо тематическим, либо учитывает цветовые предпочтения пользователя. Поэтому для изменения цвета вам нужно либо отключить визуальные стили и установить ForeColor
, либо нарисовать элемент управления самостоятельно.
Что касается непрерывного стиля, то вместо блоков вы можете установить стиль
свойство:
pBar.Style = ProgressBarStyle.Continuous;
В конструкторе вам просто нужно установить свойство ForeColor в любой цвет, который вы хотите. В случае с красным для него есть предопределенный цвет.
Чтобы сделать это в коде (C #), сделайте это:
pgs.ForeColor = Color.Red;
Редактировать : О да, также установите Стиль на непрерывный. В коде, например:
pgs.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
Другое редактирование: Вам также необходимо удалить строку, которая читает Application.EnableVisualStyles ()
из вашего Program.cs
(или аналогичный). Если вы не можете сделать это, потому что хотите, чтобы у остальной части приложения были визуальные стили, тогда я бы предложил нарисовать элемент управления самостоятельно или перейти к WPF, так как с WPF это легко сделать. Вы можете найти руководство по рисованию индикатора выполнения на codeplex
попробуйте использовать сообщение PBM_SETBARCOLOR, которое должно помочь с SendMessage
См. http://www.vbforums.com/showthread.php?t=248721 для пример.
Модификация к ответу Дыбурвелла. (У меня недостаточно репутации, чтобы отредактировать его самому.) Как и его ответ, он работает с включенными «Визуальными стилями». Вы можете просто установить свойство 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);
}
}
Я просто поместил это в статический класс.
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);
}
Надеюсь, это поможет,
Марк