Лучший отвечающий
Красные линии по сторонам прямоугольника и по его диагоналям в графике

Вопрос
-
Здравствуйте! 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=441813 января 2011 г. 17:04
-
Напрямую из разных потоков рисовать нельзя, будет исключение и как раз те самые красные линии. Как это делается правильно, можно посмотреть в примере MDSN: http://msdn.microsoft.com/ru-ru/library/ms171728.aspx13 января 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