Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Элемент для рисования графиков в VB 
:(
    Опции темы
Cleric
Дата 20.12.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



не подскажите какой нибудь? (обычные графики типа простейших экселевских с линиями)
жылательно попроще в обращении... заранее спасибо
PM MAIL   Вверх
Exception
Дата 20.12.2005, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Это же самому нетрудно реализовать. Есть COMовский эл-т MSChart, посмотри его
PM   Вверх
Cleric
Дата 21.12.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



Цитата
Есть COMовский эл-т MSChart, посмотри его


тока как в нем рисовать? (допустим у меня есть массив У())


Цитата
самому нетрудно реализовать


ну частично я сам реализовал, но там оси прорисовывать и всякая другая мелочь...
а вот кстати еще вопрос: если в pictureboxе рисовать что то с помощью create graphics, то если например потом нарисованное чем то закроется, то оно стирается в этом месте... как сделать что бы не стиралось?
smile
PM MAIL   Вверх
arilou
Дата 21.12.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(Cleric @ 21.12.2005, 10:25)
вот кстати еще вопрос: если в pictureboxе рисовать что то с помощью create graphics, то если например потом нарисованное чем то закроется, то оно стирается в этом месте... как сделать что бы не стиралось

Можно, например, прицепить обработчик к событию PictureBox.Paint и рисовать там. Тогда при перерисовке PictureBox'а будет перерисовываться и твоя графика.

Это сообщение отредактировал(а) arilou - 21.12.2005, 17:41


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



Цитата
Можно, например, прицепить обработчик к событию PictureBox.Paint и рисовать там. Тогда при перерисовке PictureBox'а будет перерисовываться и твоя графика.


что то я попробовал и мне не понравилось... она не всегда перересовывается.... иногда белые куски остаются... как нибудь по другому нельзя?



PM MAIL   Вверх
arilou
Дата 22.12.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(Cleric @ 22.12.2005, 11:54)
что то я попробовал и мне не понравилось

Значит ты что-то не то делаешь. Приведи код, посмотрим.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



есть у меня саб PaintGraph, который значения из массива на указаном пикчуребоксе рисует

код на событие paint вешаю такой:

Код

Private Sub pbGraph_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles pbGraph.Paint
        PaintGraph(pbgraph, Y, ...)
End Sub


где pbgraph - picturebox
Y - массив Double, которые рисуются на боксе...
PM MAIL   Вверх
arilou
Дата 22.12.2005, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(Cleric @ 22.12.2005, 15:00)
PaintGraph(pbgraph, Y, ...)

А этот метод по-подробнее?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



ну что то типа:

(когда висит на кнопке, то все нормально рисует)

Код

Public Sub PaintGraph(ByVal PBOX As PictureBox, ByVal X(,) As Double, ByVal C As Drawing.Color, ByVal MaxVal As Double, ByVal TStart As Integer, ByVal TAdd As Integer)
        ' x(t,0) - рисуется первый столбец
        If X Is Nothing Then Exit Sub
        Dim maxT As Integer = X.GetUpperBound(0) + TStart + TAdd, mX As Double = MaxVal

        Dim gW As Integer = PBOX.Width - 10
        Dim gH As Integer = PBOX.Height - 10

        Dim t As Integer, P As New Drawing.Pen(C, 2), Pblack As New Drawing.Pen(Color.Black, 1), PGray As New Drawing.Pen(Color.Gray, 1)
        PGray.DashStyle = Drawing2D.DashStyle.Dash


        Dim dx As Double = gW / maxT
        Dim ky As Double = gH / mX
  
        Dim pX As Single, pX2 As Single
        Dim pY As Single, pY2 As Single

        For t = TStart To maxT - TAdd
            If t >= TStart And t <= maxT - TAdd Then
                pX = Convert.ToSingle(5 + t * dx)
                pY = gH + 5 - Convert.ToSingle(Int(X(t - TStart, 0) + 0.5) * ky)
                pX2 = Convert.ToSingle(5 + (t + 1) * dx)
                If t < maxT - TAdd Then pY2 = gH + 5 - Convert.ToSingle(Int(X(t - TStart + 1, 0) + 0.5) * ky)


                If t < maxT - TAdd Then PBOX.CreateGraphics.DrawLine(P, pX, pY, pX2, pY2)
                PBOX.CreateGraphics.DrawLine(PGray, pX, pY, pX, gH + 5)
                PBOX.CreateGraphics.DrawEllipse(P, pX - 2, pY - 2, 4, 4)
                ' label value:
                PBOX.CreateGraphics.DrawString(Int(X(t - TStart, 0) + 0.5), Font1, Brushes.Black, pX + 2, pY - 5)
            End If
        Next

        ' Drawing axies and so on:
        PBOX.CreateGraphics.DrawLine(Pblack, 5, 5, 5, gH + 5)
        PBOX.CreateGraphics.DrawLine(Pblack, 5, gH + 5, gW + 5, gH + 5)
        PBOX.CreateGraphics.DrawString(mX, Font1, Brushes.Black, 5, 5)
End Sub



то есть он и потом нормально рисует, но могут оставаться белые пятна, если утащить окно с экрана а потом обратно вытаскивать

Это сообщение отредактировал(а) Cleric - 22.12.2005, 15:12
PM MAIL   Вверх
arilou
Дата 22.12.2005, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(Cleric @ 22.12.2005, 15:11)
PBOX.CreateGraphics.DrawLine(PGray, pX, pY, pX, gH + 5)

Соооовсем не так smile Надо передавать в метод PaintGraph объект Graphics, и рисовать используя его.

Например:

Код

Private Sub pbGraph_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles pbGraph.Paint
        PaintGraph(pbgraph, Y, ..., e.Graphics)
End Sub

Public Sub PaintGraph(ByVal PBOX As PictureBox, ByVal X(,) As Double, ByVal C As Drawing.Color, ByVal MaxVal As Double, ByVal TStart As Integer, ByVal TAdd As Integer, g As Graphics)
        ' x(t,0) - рисуется первый столбец
        If X Is Nothing Then Exit Sub
        Dim maxT As Integer = X.GetUpperBound(0) + TStart + TAdd, mX As Double = MaxVal

        Dim gW As Integer = PBOX.Width - 10
        Dim gH As Integer = PBOX.Height - 10

        Dim t As Integer, P As New Drawing.Pen(C, 2), Pblack As New Drawing.Pen(Color.Black, 1), PGray As New Drawing.Pen(Color.Gray, 1)
        PGray.DashStyle = Drawing2D.DashStyle.Dash


        Dim dx As Double = gW / maxT
        Dim ky As Double = gH / mX
  
        Dim pX As Single, pX2 As Single
        Dim pY As Single, pY2 As Single

        For t = TStart To maxT - TAdd
            If t >= TStart And t <= maxT - TAdd Then
                pX = Convert.ToSingle(5 + t * dx)
                pY = gH + 5 - Convert.ToSingle(Int(X(t - TStart, 0) + 0.5) * ky)
                pX2 = Convert.ToSingle(5 + (t + 1) * dx)
                If t < maxT - TAdd Then pY2 = gH + 5 - Convert.ToSingle(Int(X(t - TStart + 1, 0) + 0.5) * ky)


                If t < maxT - TAdd Then g.DrawLine(P, pX, pY, pX2, pY2)

                g.DrawLine(PGray, pX, pY, pX, gH + 5)
                g.DrawEllipse(P, pX - 2, pY - 2, 4, 4)
                ' label value:
                g.DrawString(Int(X(t - TStart, 0) + 0.5), Font1, Brushes.Black, pX + 2, pY - 5)
            End If
        Next

        ' Drawing axies and so on:
        g.DrawLine(Pblack, 5, 5, 5, gH + 5)
        g.DrawLine(Pblack, 5, gH + 5, gW + 5, gH + 5)
        g.DrawString(mX, Font1, Brushes.Black, 5, 5)
End Sub


Это сообщение отредактировал(а) arilou - 22.12.2005, 15:25


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



да. спасибо... smile
PM MAIL   Вверх
arilou
Дата 22.12.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Cleric
smile


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



только на resize плохо работает...
PM MAIL   Вверх
arilou
Дата 22.12.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(Cleric @ 22.12.2005, 16:40)
только на resize плохо работает...

Тут надо хитро поступить smile Есть два варианта:

1) *красивый*. Наследовать свой класс от PictureBox, и в конструкторе после InitalizeComponent написать:
Код

SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
ResizeRedraw = False

Вместо PictureBox'а везде использовать свой класс.

2) *хакерский smile ГЫ. Как раз сегодня использовал* Где-нить в конструкторе формы написать:

Код

Dim mi as MethodInfo = PBOX.GetType().GetMethod("SetStyle", BindingFlags.NonPublic Or BindingFlags.Instance)
mi.Invoke(PBOX, new object(){ControlStyles.DoubleBuffer, true})
mi.Invoke(PBOX, new object(){ControlStyles.AllPaintingInWmPaint, true})

Dim pi As PropertyInfo = PBOX.GetType().GetProperty("ResizeRedraw", BindingFlags.NonPublic Or BindingFlags.Instance)
pi.SetValue(PBOX, true, Nothing)


Да, для второго способа подключить namespace System.Reflection

Это сообщение отредактировал(а) arilou - 22.12.2005, 16:50


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Cleric
Дата 22.12.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 14.12.2004
Где: Москва/Н.Новгород

Репутация: нет
Всего: нет



э... ну там вроде и на SizeChanged можно повесить что бы перересовывалось (как аргумент Graphics отправлять creategraphics пикчуребокса) все помоему нормально работать начинает...

но за хитрые методы отдельное спасибо
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.