我需要绘制一个不同的进度条VisualStyleRenderer.如果我使用一切正常Graphics的OnPaint方法.但是因为我想将它保存在硬盘中,我需要在Bitmap对象中渲染进度条然后保存它.
这是示例代码
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(RenderProgressbarImage(), new Point(5, 5));
//following code works good
progressRenderer.SetParameters("PROGRESS", 11, 2);
progressRenderer.DrawBackground(e.Graphics, new Rectangle(125, 5, 100, 13));
}
VisualStyleRenderer progressRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Bar.Normal);
Bitmap RenderProgressbarImage()
{
Bitmap bmp = new Bitmap(100, 13);
using (Graphics g = Graphics.FromImage((Image)bmp))
{
progressRenderer.SetParameters("PROGRESS", 11, 2);
progressRenderer.DrawBackground(g, new Rectangle(0, 0, bmp.Width, bmp.Height));
}
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我在Bitmap中绘制它,它有黑色角落而不是透明.但是,如果它使用Graphics的OnPaint,一切都吸引好.

使用Bitmap,您将按照您的方式使用 GDI+ 生成一个矩形对象。
创建带圆角的图像 可能会帮助您根据需要创建圆角位图图像。
编辑- 修改RenderProgressbarImage为将Graphics对象作为输入
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(RenderProgressbarImage(e.Graphics), new Point(5, 5));
//Test to Check for Output
RenderProgressbarImage(e.Graphics).Save(@"C:\Bitmap.bmp");;
//following code works good
progressRenderer.SetParameters("PROGRESS", 11, 2);
progressRenderer.DrawBackground(e.Graphics, new Rectangle(125, 5, 100, 13));
}
Bitmap RenderProgressbarImage(Graphics g)
{
Bitmap bmp = new Bitmap(100, 13, g);
progressRenderer.SetParameters("PROGRESS", 11, 2);
progressRenderer.DrawBackground(g, new Rectangle(0, 0, bmp.Width, bmp.Height));
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
Edit2:根据下面OP的评论进行修改以简化解决方案
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Bitmap bmp = new Bitmap(100, 13, e.Graphics);
bmp.Save(<SomefilePath.png>);
//following code works good
progressRenderer.SetParameters("PROGRESS", 11, 2);
progressRenderer.DrawBackground(e.Graphics, new Rectangle(125, 5, 100, 13));
}
Run Code Online (Sandbox Code Playgroud)
Bitmap对此的注释:在事件中进行保存OnPaint将对渲染性能产生明确的影响。也许只是更新Bitmap类中的变量并Bitmap定期从不同的Thread/某些Timer/等保存;这一切都取决于您的需求。