VisualStyleRenderer到位图

xme*_*men 5 c# gdi+

我需要绘制一个不同的进度条VisualStyleRenderer.如果我使用一切正常GraphicsOnPaint方法.但是因为我想将它保存在硬盘中,我需要在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中绘制它,它有黑色角落而不是透明.但是,如果它使用GraphicsOnPaint,一切都吸引好.

截图

jor*_*123 1

使用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/等保存;这一切都取决于您的需求。