您可以自定義名爲ToolStripProgressBar
的ToolStripControlHost
承載的ProgressBar
的外觀和風格。您可以通過ToolStripProgressBar
的屬性ProgressBar
訪問託管的ProgressBar
。然後您可以爲該ProgressBar
添加Paint
事件處理程序。但是,只有當控制樣式UserPaint
設置爲ProgressBar
時,纔會觸發此Paint
事件,這是通過設計(當然與默認支持Paint
事件的其他常規控件不同)。所以你可以嘗試下面的代碼。事實上,我試着註釋掉行Application.EnableVisualStyles();
看你要與非XP風格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;
}
這不是外觀你在等待什麼?:

更新:連續進度條,它比塊樣式要簡單得多,請嘗試以下更新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);
}
因爲在應用程序級別啓用了VisualStyles('Application.EnableVisualStyles'),所以您可能會運氣不好。 'Forms'有一個'VisualStyles'命名空間,並且進度條從那裏繼承,但是那個名字空間更適合應用那些VisualStyles。 – Plutonix
我敢肯定,沒有你自己做所有的繪畫,這是無法完成的。 –