我需要通过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;
}

但是,如果我用位图绘制它,则它具有黑色的角,而不是透明的。但是,如果它使用GraphicsOnPaint,那么一切都会很好。

最佳答案

使用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/

10-13 04:15