我需要通过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;
}
但是,如果我用位图绘制它,则它具有黑色的角,而不是透明的。但是,如果它使用
Graphics
的OnPaint
,那么一切都会很好。 最佳答案
使用Bitmap
,您将按照自己的方式使用GDI +创建一个矩形对象。
Creating an Image with Rounded Corners可能会帮助您根据需要创建舍入的位图图像。
编辑-修改后的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;
}
编辑2:进行了修改,以简化以下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));
}
关于这一点的注释:在
Bitmap
事件中保存OnPaint
将对渲染产生一定的性能影响。也许只是在您的类中更新Bitmap
变量,并定期从其他Bitmap
/一些Thread
/etc保存Timer
;这一切都取决于您的需求。关于c# - VisualStyleRenderer到位图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16030798/