您可以自定义由名为 ToolStripProgressBar 的 ToolStripControlHost 托管的 ProgressBar 的外观。您可以通过ToolStripProgressBar 的属性ProgressBar 访问托管的ProgressBar。然后,您可以为该ProgressBar 添加Paint 事件处理程序。然而,只有在为ProgressBar 设置控件样式UserPaint 时才会触发此Paint 事件,这是设计的(当然与默认支持Paint 事件的其他普通控件不同)。所以你可以试试下面的代码。事实上,我尝试用非 XP 样式 ToolStripProgressBar 注释掉行 Application.EnableVisualStyles(); 以查看您真正想要的东西,看起来它太简单了,下面的代码应该可以满足您的需求:
//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;
}
这外观和感觉不正是你在等待的吗?:
更新:对于连续进度条,它比积木样式简单得多,请尝试以下更新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);
}