更改 ToolStripProgressBar 的颜色而不禁用 XP 视觉样式?

Ele*_*ios 1 .net c# vb.net winforms progress-bar

在 Winforms 中,我想更改 a 的背景颜色ToolStripProgressBar而不禁用XP Visual Syles整个应用程序,这可能吗?也许仅对StatusStrip控件禁用 XP 视觉样式?

我知道 ToolStripProgressBar 不继承自 Control 类型,但 StatusStrip 继承(不是?),那么确定这一定是一个解决方案,或者可能继承 StatusStrip 来控制绘画事件或其他东西......我不知道不知道该怎么做。

我尝试将控件RenderMode的属性设置StatusStrip为专业模式,但系统仍在选择 myToolStripProgressBar 的背景色。

Kin*_*ing 5

ProgressBar您可以自定义由ToolStripControlHost命名的托管的外观和感觉ToolStripProgressBarProgressBar您可以通过ProgressBar的属性访问托管ToolStripProgressBar。然后您可以添加Paint该事件处理程序ProgressBar。但是,仅当为设定了Paint控件样式时才会触发此事件,这是设计使然(当然与默认情况下支持该事件的其他普通控件不同)。所以你可以尝试下面的代码。事实上,我尝试注释掉该行,以查看您实际上想要的非 XP 样式,但看起来太简单了,以下代码应该可以完成您想要的操作:UserPaintProgressBarPaintApplication.EnableVisualStyles();ToolStripProgressBar

//define some variables first, note that don't rely on the 
//ProgressBarRenderer.ChunkThickness and ProgressBarRenderer.ChunkSpaceThickness
//because they are actually small and using our own variables will allow us to change
//the chunk size easily.
int chunkThickness = 13;
int chunkSpace = 1;
Rectangle chunkRect = new Rectangle(0, 0, chunkThickness,
                          toolStripProgressBar1.ProgressBar.Height-4);
//The hosted ProgressBar's Paint event handler
private void progressBar_Paint(object sender, PaintEventArgs e){
  chunkRect.Location = Point.Empty;
  chunkRect.Offset(2, 2);                
  var percent = (float) toolStripProgressBar1.Value / toolStripProgressBar1.Maximum;
  var valueLength = percent * toolStripProgressBar1.ProgressBar.Width;
  var chunks = (int) (valueLength / (chunkThickness + chunkSpace) + 0.5f);
  for (int i = 0; i < chunks; i++) {
     //I use the green color for the chunk color, it's up to you.
     e.Graphics.FillRectangle(Brushes.Green, chunkRect);                    
     chunkRect.Offset(chunkThickness + chunkSpace, 0);
  }
  ControlPaint.DrawBorder3D(e.Graphics, toolStripProgressBar1.ProgressBar.ClientRectangle,
                           Border3DStyle.SunkenOuter);
}
//Now in your form constructor, just add this code to end up everything before
//trying running the code:
public Form1(){
   InitializeComponent();
   //do this to allow the Paint event to be fired and more ...
   typeof(Control).GetMethod("SetStyle", System.Reflection.BindingFlags.NonPublic |
                                         System.Reflection.BindingFlags.Instance)
                  .Invoke(toolStripProgressBar1.ProgressBar, 
                          new object[] {ControlStyles.UserPaint |
                                        ControlStyles.OptimizedDoubleBuffer, true });
   //hook up the progressBar_Paint event handler for the hosted ProgressBar
   toolStripProgressBar1.ProgressBar.Paint += progressBar_Paint;
}
Run Code Online (Sandbox Code Playgroud)

这不是您正在等待的外观和感觉吗?:

在此输入图像描述

更新:对于连续进度条,它比块样式简单得多,请尝试以下更新progressBar_Paint

private void progressBar_Paint(object sender, PaintEventArgs e){
  var percent = (float) toolStripProgressBar1.Value / toolStripProgressBar1.Maximum;
  var valueLength = percent * toolStripProgressBar1.ProgressBar.Width;
  var chunkRect = new RectangleF(2,2,valueLength,
                                 toolStripProgressBar1.ProgressBar.Height-4);
  e.Graphics.FillRectangle(Brushes.Green, chunkRect);
  ControlPaint.DrawBorder3D(e.Graphics, toolStripProgressBar1.ProgressBar.ClientRectangle,
                           Border3DStyle.SunkenOuter);
}
Run Code Online (Sandbox Code Playgroud)