Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

помогите с корректным динамическим рисованием кривых

17K
15 июня 2008 года
Suleyman
12 / / 15.06.2008
Помогите решить следующую проблему. Я динамически (с помощью мыши) рисую на TabControl кривую Безье. Пока пользователь не закончит рисовать, я её отрисовываю через Graphics конрола. Как только пользователь отпустит кнопку мыши значит рисование закончено и все точки (рисую Безье по 4 точкам) сохраняю в ArrayList, содержимое которого, в случае надобности, перерисовывается в onPainte. Динамическое рисование решаю так: когда пользователь рисует мышью, программа предыдущее положение кривой рисует цветом заднего фона контрола а потом сверху рисуетсяновое изображение (всё нормально рисуется без всяких мерцаний), но как только я рисую вторую кривую и она персекает любую предыдущую то в месте пересечения все стирается в цвет фона (ну вообщем то это понятно так построен алгоритм рисования). А теперь наконецто вопросс - как мне переделать свой алгоритм чтобы ранее нарисованые кривые не стирались когда я поверх них рисую новую. Если можно то желательно с примером кода
P.S. С# VS2005.
P.P.S. Если вызвать полную перерисовку содержимого то содержимое ArrayList перерисовывается нормально так как линии друг друга не затирают
341
16 июня 2008 года
Der Meister
874 / / 21.12.2007
Можа не затирать фон полностью, а, в начале операции рисования кривой, сохранить содержимое фона
 
Код:
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);
}
, а при перерисовке использовать участок фона, находящийся в области видимости кривой.
17K
16 июня 2008 года
Suleyman
12 / / 15.06.2008
Цитата: 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);
}
, а при перерисовке использовать участок фона, находящийся в области видимости кривой.



может я чего не понял, но куда вставлять данный кусок кода? Потому как если его вставить вместо кода перерисовки линии то за несколько секунд рисования вылетает исключение о нехватке памяти (съедает 3 гига оперативки). А вот этой фразы "а при перерисовке использовать участок фона, находящийся в области видимости кривой" я совершенно не понял (уж простите, но не могли бы Вы поточнее объяснить)

341
17 июня 2008 года
Der Meister
874 / / 21.12.2007
Код:
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;
        }
    }
}
17K
18 июня 2008 года
Suleyman
12 / / 15.06.2008
Спасибо за помощь. Сделал по вашему примеру, теперь нарисованые ранее кривые не затираются но появился неприятный эффект мерцания когда рисуется последняя кривая. Буду думать дальше как решить новую проблему.
341
19 июня 2008 года
Der Meister
874 / / 21.12.2007
DoDrawCurve() вызываешь откуда? И есть ли двойная буфферизация?
17K
19 июня 2008 года
Suleyman
12 / / 15.06.2008
на форме двойная буферизация включена а функция вызывается каждый раз при поступлении onMouseMove (когда при рисовании кривой движется мышь)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог