我通过绘制颜色变化的线条手动绘制线性渐变。然而,这是非常缓慢的,当我调整窗口大小时,我似乎更新了。我如何让它更快?在这个例子中,色标是线性的,但后来我不想做出非线性渐变。
protected override void OnPaintBackground(PaintEventArgs paintEvnt)
{
SuspendLayout();
// Get the graphics object
Graphics gfx = paintEvnt.Graphics;
// Create a new pen that we shall use for drawing the line
// Loop and create a horizontal line 10 pixels below the last one
for (int i = 0; i <= 500; i++)
{
Pen myPen = new Pen(Color.FromArgb(i/2,0,0));
gfx.DrawLine(myPen, 0, i, 132, i);
}
ResumeLayout();
}
答案 0 :(得分:3)
如果你只想绘制一次而不调整大小,我建议你把它写一次Bitmap对象,然后将这个位图绘制到背景中。此外,您可以在窗体上启用双缓冲。这应该是一个名为DoubleBuffering的属性,或类似的东西。这可以减少重绘表单时的闪烁。
答案 1 :(得分:3)
问题是GDI +非常慢。
您应该使用GDI +的高级构造,这些构造相对较快(相对于您现在所做的绘制线)。有关例如http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.lineargradientbrush.aspx的详情,请参阅{{3}} LinearGradientBrush
。这些刷子和钢笔中有更多可以帮助您提高性能。
还有一件事:Suspend/ResumeLayout
在你的例子中没有做任何事情。这些方法仅适用于您通过以下方式进行布局时:将Control
添加到当前表单或更改现有Control
的属性,例如Dock
属性或Height
和Width
。
答案 2 :(得分:1)
您可以预先计算颜色值,这样您就不必在每次重绘时都这样做。除此之外,如果不采用更低级别的API(如XNA),你可以做的更多。
更新:在WinForms控件中托管XNA是完全可行的。在this question中有一些很好的链接。
答案 3 :(得分:0)
或许指定一个ColorBlend
与Pieter建议的LinearGradientBrush
一起使用,可以解决您对将来能够绘制非线性渐变的担忧吗?
您可以创建一个ColorBlend
对象,指定您选择的颜色和每个颜色的任意位置。通过将InterpolationColors
的{{1}}属性设置为LinearGradientBrush
对象,您应该能够获得所需的任何效果。
MSDN提供以下示例:
ColorBlend