none
Красные линии по сторонам прямоугольника и по его диагоналям в графике RRS feed

  • Вопрос

  • Здравствуйте! C++, VS2008, Windows Form Application.

    Програма должна строить координаты ОХ, ОУ и рисовать точками кривую по данным от прибора. Все работает ОК, если я не переключаюсь между окнами, в другие приложения. Если же перейти в другое окно (например окно Ворда) и затем вернуться в окно моей программы, то моя система координат и старые точки исчезают. Чтобы это обойти я  вставил в Paint моей формы функции прорисовки осей и восстановление "старых" точек. Вроде помогло, но иногда (не всегда) когда возвращаюсь назад в мое окно с графикой, то появляються красные линии по  сторонам прямоугольника и по его диагоналям на белом фоне. При этом новые точки на графике продолжают строиться при поступлении новых данных, но осей нет. Почему это(глюки с красными линиями и отсутсвие осей) происходит? Может как-то лучше по другому реализовать восстановление старой графики и работать не с Paint?  Shown я уже пробовал, то же самое.  У меня Windows Vista 64.

    Заранее спасибо за ответ.  

    • Перемещено PashaPash 13 января 2011 г. 17:59 (От:Работа в среде Visual Studio)
    13 января 2011 г. 1:43

Ответы

  • Перечеркнутый красными линиями прямоугольник сигнализирует об исключении, возникшем в методе рисования. Без исходного кода метода / отладки сложно понять, какое именно исключение возникает.
    • Помечено в качестве ответа aaa75 13 января 2011 г. 15:14
    13 января 2011 г. 9:22
  • О "прорисовке осей", Paint-е и прочей галиматье нужно забыть раз и навсегда, и перейти к использованию продвинутого инструмента - Charting, многопоточность. На начальном этапе это потребует некоторых усилий, но это сторицей вернется эффективностью программирования. Дерзайте!
    • Предложено в качестве ответа PashaPash 13 января 2011 г. 19:07
    • Помечено в качестве ответа Abolmasov Dmitry 13 января 2011 г. 23:17
    13 января 2011 г. 19:03

Все ответы

  • Перечеркнутый красными линиями прямоугольник сигнализирует об исключении, возникшем в методе рисования. Без исходного кода метода / отладки сложно понять, какое именно исключение возникает.
    • Помечено в качестве ответа aaa75 13 января 2011 г. 15:14
    13 января 2011 г. 9:22
  • Спасибо. Попробую в пошаговом режиме посмотреть. А второй вопрос: как лучше восстановить старую графику после переключения между окнами ?  Через Paint это делать нормально? Нет ли какой-нибудь другой функции Hold типа как в Матлабе?

    13 января 2011 г. 15:17
  • Да, через Paint - нормально. MSDN так же советует делать.
    13 января 2011 г. 15:42
  • Привет! 1. Рисовать нужно в PictureBox - все перерисовки система осуществляет сама. 2. в .Net 4.0 есть класс - см. http://msdn.microsoft.com/ru-ru/library/system.windows.forms.datavisualization.charting.aspx, котороый специально сделан для самых различных графиков, финансовых, в реальном времени, масштабируемых, гистограмм и пр. подписи, легенды - все как надо. Есть смысл переехать в .Net 4.0 как минимум Exspress. 3. Есть библиотека с примерами программирования, не помню откуда я ее качнул, но могу кинуть, если дадите куда.
    13 января 2011 г. 16:37
  • Ой, прошу прощения. Увидел про C++, но не заметил WinForms. Это значит, managed C++.

    Про исключение все верно, а для рисования, действительно, лучше использовать PictureBox (или, в зависимости от задачи, более специфические средства).

    Кстати, вопрос к автору: отрисовка у Вас производится в отдельном потоке или в потоке GUI? Самая частая ошибка, связанная с отрисовкой, заключается в попытке обратиться к визуальному элементу из другого потока.

    13 января 2011 г. 16:46
  • 1. У меня графиков рисуется достаточно много ~ 20-30, каждый в отдельной форме, а значит в отдельном потоке, соответственно и управление для каждого свое. 2. Вот ссылка, по-моему, я отсюда же все и взял - очень полезная вещь, и доступная. http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=4418
    13 января 2011 г. 17:04
  • Напрямую из разных потоков рисовать нельзя, будет исключение и как раз те самые красные линии. Как это делается правильно, можно посмотреть в примере MDSN: http://msdn.microsoft.com/ru-ru/library/ms171728.aspx
    13 января 2011 г. 17:17
  • У любого контрола система перерисовку осуществляет сама. PictureBox - это контрол для отображения готовых картинок из GIF/PNG/JPG. Никаких преимуществ для рисования он не дает.
    13 января 2011 г. 17:30
  • Понятно, что каждый поток должен рисовать свое. Посмотрите сюда http://www.gotdotnet.ru/forums/2/129771/page-2/ сообшение #48, программа, - вот так я и рисую. Кстати а почему C++, а не C#. Шарп приятней.
    13 января 2011 г. 17:33
  • ПалПалычу. Конечно. Есть морока преобразовать график в битмап. Но это неудобство перекрывается отсутствием головной боли о перерисовке, PictureBox это делает самостоятельно. Ну, а с появлением System.Windows.Forms.DataVisualization.Charting все решилось просто и красиво.
    13 января 2011 г. 17:48
  • Преимущество PictureBox в том, что его свойству Image можно присвоить ранее созданный экземпляр класса Bitmap, а рисование производить в этом bitmap-е. В этом случае, изображение не будет теряться при его перекрытии другим окном, и не нужно будет полностью перерисовывать его в каждом вызове обработчика Paint.
    13 января 2011 г. 17:48
  • Тру, импользование стандартного Charting позволяет избежать еще одного велосипеда :)

    • Изменено PashaPash 13 января 2011 г. 18:56
    13 января 2011 г. 17:51
  • А недостаток такого способа - необходимость ручного стирания из Bitmap-а, висение битмапа в памяти, и отсутствие ClipRectangle. Всегда есть выбор. Который нужно сделать в сторону Charting :)
    13 января 2011 г. 17:58
  • Прошу прощения, предыдущий вопрос я задавал автору, но не заметил, что ответили на него Вы. Подумал, что автор как раз рисует из разных потоков без Control.Invoke().
    13 января 2011 г. 17:58
  • Конечно, это еще один велосипед, но удобный и доступный. А мы только и занимаемся тем, что крутим педали...
    13 января 2011 г. 18:04
  • Спасибо Алексей и QazRdx. Мне кажеться, что вы верно уловили мою проблему. Я запускаю опрос прибора и вывод даных на график в потоке№1, а в Paint использую функии для прорисовки координат и "старых" точек, функции которые используются еще и в потоке№1.  Наверное отсюда и конфликты. К сожалению еще не успел попробовать ваши советы. Я вот думаю, может попробовать  написать копии функций прорисовки осей и точек специально для Paint, чтобы уйти от конфликта совместного исползования? Только вот эти функии будут использовать один и тот же масив, где храняться результати измерений. не будет ли снова конфликта (?). С++ использую, т. к. есть библиотеки для прибора под С++. Спасибо еще раз, я новичок и про многопоточное програмирование узнал несколько дней назад на этом же сайте:) Надеюсь ваши советы помогут не только мне.       
    13 января 2011 г. 18:12
  • Боюсь скатиться в оффтоп, но... Выбор инструмента должен зависеть от поставленной задачи, а о самой задаче мы ничего не знаем. Возможно, в задаче автора вышеперечисленные функции не нужны, а наличие bitmap в памяти с лихвой будет компенсировано отсутствием необходимости контроля и отрисовки ранее нарисованных точек графика. Но DataVisualization.Charting - да, покрывает довольно большой спектр задач, особенно если в них требуется красивая визуализация.
    13 января 2011 г. 18:23
  • Я как раз в положительном смысле о Chart отозвался. Подправил, на всякий случай, во избежание :)
    13 января 2011 г. 18:55
  • Мы и так скатились в оффтоп. топикастер пометил "как ответ" еще три часа назад.
    13 января 2011 г. 18:57
  • О "прорисовке осей", Paint-е и прочей галиматье нужно забыть раз и навсегда, и перейти к использованию продвинутого инструмента - Charting, многопоточность. На начальном этапе это потребует некоторых усилий, но это сторицей вернется эффективностью программирования. Дерзайте!
    • Предложено в качестве ответа PashaPash 13 января 2011 г. 19:07
    • Помечено в качестве ответа Abolmasov Dmitry 13 января 2011 г. 23:17
    13 января 2011 г. 19:03
  • Всем спасибо за класные идеи. К сожалению в VS2008, ASP 3.5 нет возможности реализовать все, в частности Charting.  Кроме того у меня график строиться в реальном времени по данным от прибора, что-то типа ВАХ. Поэтому, как я понял, мне не подойдет PictureBox. Код выложить не могу, т.к. он слишком большой.

    Свою проблему я решил примитивно (но мне ОК): я в Paint присвоиваю переменной static int значение 0, а в потоке с графикой каждый раз перерисовываю старые данные если эта переменная равно 0. Вроде работает и конфликтов нет. Спасибо еще раз. 

    13 января 2011 г. 20:18