Rectangle rectFrame = this.ClientRectangle;
Size size = rectFrame.Size;
Bitmap background = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(background))
{
Point screenPos = this.PointToScreen(rectFrame.Location);
g.CopyFromScreen(screenPos, new Point(0, 0), size);
}
помогите с корректным динамическим рисованием кривых
P.S. С# VS2005.
P.P.S. Если вызвать полную перерисовку содержимого то содержимое ArrayList перерисовывается нормально так как линии друг друга не затирают
Код:
Цитата: Der Meister
Можа не затирать фон полностью, а, в начале операции рисования кривой, сохранить содержимое фона
, а при перерисовке использовать участок фона, находящийся в области видимости кривой.
Код:
Rectangle rectFrame = this.ClientRectangle;
Size size = rectFrame.Size;
Bitmap background = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(background))
{
Point screenPos = this.PointToScreen(rectFrame.Location);
g.CopyFromScreen(screenPos, new Point(0, 0), size);
}
Size size = rectFrame.Size;
Bitmap background = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(background))
{
Point screenPos = this.PointToScreen(rectFrame.Location);
g.CopyFromScreen(screenPos, new Point(0, 0), size);
}
может я чего не понял, но куда вставлять данный кусок кода? Потому как если его вставить вместо кода перерисовки линии то за несколько секунд рисования вылетает исключение о нехватке памяти (съедает 3 гига оперативки). А вот этой фразы "а при перерисовке использовать участок фона, находящийся в области видимости кривой" я совершенно не понял (уж простите, но не могли бы Вы поточнее объяснить)
Код:
class MyForm : UserForm
{
Bitmap m_Background;
bool m_IsDrawing;
void BeginDrawCurve()
{
if (!m_IsDrawing)
{
Rectangle rectFrame = this.ClientRectangle;
Size size = rectFrame.Size;
m_Background = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(m_Background))
{
Point screenPos = this.PointToScreen(rectFrame.Location);
g.CopyFromScreen(screenPos, new Point(0, 0), size);
}
// TODO: производим остальные операции,
// которые необходимо выполнить до начала рисования кривой
m_IsDrawing = true;
}
}
void DoDrawCurve(Graphics g)
{
if (m_IsDrawing)
{
Rectangle rectCurveLayout = // определяем область вывода для кривой
// Готовим фон
g.DrawImage(m_Background, rectCurveLayout, rectCurveLayout, GraphicsUnit.Pixel);
// TODO: Рисуем кривую
}
}
void EndDrawCurve()
{
if (m_IsDrawing)
{
// TODO: завершаем процесс рисования кривой
m_Background.Dispose();
// Обнуляем ссылки, помечая объект на удаление
m_Background = null;
m_IsDrawing = false;
}
}
}
{
Bitmap m_Background;
bool m_IsDrawing;
void BeginDrawCurve()
{
if (!m_IsDrawing)
{
Rectangle rectFrame = this.ClientRectangle;
Size size = rectFrame.Size;
m_Background = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(m_Background))
{
Point screenPos = this.PointToScreen(rectFrame.Location);
g.CopyFromScreen(screenPos, new Point(0, 0), size);
}
// TODO: производим остальные операции,
// которые необходимо выполнить до начала рисования кривой
m_IsDrawing = true;
}
}
void DoDrawCurve(Graphics g)
{
if (m_IsDrawing)
{
Rectangle rectCurveLayout = // определяем область вывода для кривой
// Готовим фон
g.DrawImage(m_Background, rectCurveLayout, rectCurveLayout, GraphicsUnit.Pixel);
// TODO: Рисуем кривую
}
}
void EndDrawCurve()
{
if (m_IsDrawing)
{
// TODO: завершаем процесс рисования кривой
m_Background.Dispose();
// Обнуляем ссылки, помечая объект на удаление
m_Background = null;
m_IsDrawing = false;
}
}
}
Спасибо за помощь. Сделал по вашему примеру, теперь нарисованые ранее кривые не затираются но появился неприятный эффект мерцания когда рисуется последняя кривая. Буду думать дальше как решить новую проблему.
DoDrawCurve() вызываешь откуда? И есть ли двойная буфферизация?
на форме двойная буферизация включена а функция вызывается каждый раз при поступлении onMouseMove (когда при рисовании кривой движется мышь)