Практическое руководство. Рисование изображений вне экрана
Обновлен: Ноябрь 2007
Можно уменьшить эффект дрожания при рисовании больших изображений с помощью объекта Graphics, не связанного с формой, для создания изображения вне экрана. Затем нарисуйте изображение на экране с помощью объекта Graphics формы.
Пример
В этом примере переопределяется метод OnPaint для создания большого точечного изображения вне экрана с помощью объекта Graphics, производного из растрового изображения. Затем выполняется рисование растрового изображения на экране с помощью объекта Graphics, возвращенного из свойства Graphics объекта PaintEventArgs.
После загрузки формы отображение рисунка займет несколько секунд.
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim bmp As Bitmap
Dim gOff As Graphics
' Create a bitmap the size of the form.
bmp = New Bitmap(ClientRectangle.Width, ClientRectangle.Height)
Dim BlueBrush As New SolidBrush(Color.Blue)
Dim WhitePen As New Pen(Color.White, 3)
' Create a Graphics object that is not on the form.
gOff = Graphics.FromImage(bmp)
gOff.FillRectangle(new SolidBrush(color.red), 0, 0, _
bmp.Width, bmp.Height)
' Draw a complex bitmap of 1000 random rectangles. It will take a few
' seconds to draw.
Dim z As Integer
For z = 1 To 1000
' Generate a random number with
' seeds from the system clock.
Thread.Sleep(1)
Dim rx As New Random()
Thread.Sleep(1)
Dim ry As New Random()
' Create rectangles in the inner area of the form.
Dim rect As New Rectangle(rx.Next(10,200), ry.Next(10,200), 10, 10)
gOff.DrawRectangle(WhitePen, rect)
gOff.FillRectangle(BlueBrush, rect)
Next z
' Use the Graphics object from
' PaintEventArgs to draw the bitmap onto the screen.
e.Graphics.DrawImage(bmp, 0, 0, ClientRectangle, GraphicsUnit.Pixel)
gOff.Dispose()
End Sub
protected override void OnPaint(PaintEventArgs e)
{
Bitmap bmp;
Graphics gOff;
// Create a bitmap the size of the form.
bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
SolidBrush BlueBrush = new SolidBrush(Color.Blue);
Pen WhitePen = new Pen(Color.White,3);
// Create a Graphics object that is not on the form.
gOff = Graphics.FromImage(bmp);
gOff.FillRectangle(new SolidBrush(Color.Red), 0, 0,
bmp.Width, bmp.Height);
// Draw a complex bitmap of 1000 random rectangles. It will take a few
// seconds to draw.
for (int z = 1; z <= 1000; z++)
{
// Generate a random number with
// seeds from the system clock.
Thread.Sleep(1);
Random rx = new Random();
Thread.Sleep(1);
Random ry = new Random();
// Create rectangles in the inner area of the form.
Rectangle rect = new Rectangle(rx.Next(10,200), ry.Next(10,200),
10, 10);
gOff.DrawRectangle(WhitePen, rect);
gOff.FillRectangle(BlueBrush, rect);
}
// Use the Graphics object from
// PaintEventArgs to draw the bitmap onto the screen.
e.Graphics.DrawImage(bmp, 0, 0, ClientRectangle, GraphicsUnit.Pixel);
gOff.Dispose();
}
Компиляция кода
Для этого примера требуются ссылки на следующие пространства имен:
Отказоустойчивость
Обратите внимание, что следует удалить объект Graphics, созданный для рисования вне экрана. Объект Graphics, возвращаемый свойством Graphics объекта PaintEventArgs, уничтожается сборщиком мусора, и для него не требуется явное удаление.