Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Вопрос к EROS'у Добавлено: 10.10.09 01:32  

Автор вопроса:  topograf
Нашел на сайте твой контрол для построения графиков.
Контрол интересный, супер.
Нужна твоя помошь!!!
Как на графике отобразить координаты курсора, с точностью до миллиметра(н-р х=1.236: у=10.265)? Как его увеличивать/уменьшать в отклик на событие "MouseWheel"?
Надеюсь на ответ.
И остальные спецы подтягивайтесь)))
Очень нужна ваша помощь!!!

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #1 Добавлено: 10.10.09 06:36
А чё тут думать? создаёш переменные X и Y, создаёш событие MouseMove и при этом событии в переменную X записываеш значение e.X, анологично в Y пишеш e.Y.

Ответить

Номер ответа: 2
Автор ответа:
 maza_____



ICQ: 9968842 

Вопросов: 40
Ответов: 337
 Web-сайт: vkontakte.ru/id25563295 добавляйтесь в друзья))
 Профиль | | #2
Добавлено: 10.10.09 11:25
  1. System.Windows.Forms.Cursor.Position()

Ответить

Номер ответа: 3
Автор ответа:
 topograf



Вопросов: 3
Ответов: 12
 Профиль | | #3 Добавлено: 10.10.09 15:26
Короче вот код, может так будет понятнее, что мне надо.
На форме Panel1 (autoScroll=True), в Panel1 размещён - PictureBox(drawGrafField):

Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class Form1
    Private Enum State
        Over
        Out
        ;Down
        Up
    End Enum
    
Private imgState As State
    Private curX As Double
    Private curY As Double
    Private _matrix As New Matrix
    Private _offsetX, _offsetY As Int32
    Private _scaleX, _scaleY As Double 'Int32
    Private miceClick As Boolean
    'Private linCur As Boolean

    Private x As Int32
    Private y As Int32
    Private _font As New Font("Tahoma", 8)

    Private p(4) As PointF
    Private pSc(4) As PointF

    Private xMin As Double
    Private xMax As Double
    Private yMin As Double
    Private yMax As Double
    Private cScrX As Double
    Private cScrY As Double
    Private pScale As Integer
    Private maxXline As Double
    Private maxYline As Double

    ' Переменная, устанавливающее состояние перемещения
    ' Если равно -1, то перемещать нельзя
    Private CheckState As Integer = -1

    ' Объявляем массив точек
    'Private apts(5) As Point 'еня вместо нее pSC(5)

    ' Размеры меток
    Private Const iSize As Integer = 4
    Private Const iCenter As Integer = iSize \ 2

    Private _mouse As Point

    Public Sub InitializeMatrix()

        _matrix = New Matrix()
        _matrix.Translate(_offsetX, _offsetY)
        _matrix.Scale(1, -1)
        _matrix.Scale(_scaleX, _scaleY)
        drawGrafField.Height = drawGrafField.Height ' / _scaleY
        drawGrafField.Width = maxXline '/ _scaleX
    End Sub
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        drawGrafField.Dispose()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.DoubleBuffered = True

        _offsetX = 0
        _offsetY = 0
        _scaleX = 1
        _scaleY = -1
        miceClick = False
        InitializeMatrix()
        'drawGrafField.CreateGraphics.PageUnit = GraphicsUnit.Millimeter
        p(0).X = -1252.521
        p(0).Y = -2652.665

        p(1).X = -685.236
        p(1).Y = -1247.854

        p(2).X = 24.333
        p(2).Y = -11.218

        p(3).X = 598.364
        p(3).Y = 129.221

        p(4).X = 1247.954
        p(4).Y = 999.221

        xMin = p(0).X
        xMax = p(0).X
        yMin = p(0).Y
        yMax = p(0).Y

        For i As Integer = 1 To pSc.GetUpperBound(0)
            If p(i).X < xMin Then
                xMin = p(i).X
            End If
            If p(i).X > xMax Then
                xMax = p(i).X
            End If
            If p(i).Y < yMin Then
                yMin = p(i).Y
            End If
            If p(i).Y > yMax Then
                yMax = p(i).Y
            End If
        Next
        maxXline = Int(Math.Abs(xMin - xMax)) + 200
        maxYline = Int(Math.Abs(yMin - yMax)) + 200

        If Math.Abs(xMin) > Math.Abs(xMax) Then 'cScrX = Int(maxXline / 2)
            cScrX = Int(Math.Abs(xMin)) + 100
        Else
            cScrX = Int(Math.Abs(xMax)) + 100
        End If
        If Math.Abs(yMin) > Math.Abs(yMax) Then 'cScrY = Int(maxYline / 2)
            cScrY = Int(Math.Abs(yMin)) + 100
        Else
            cScrY = Int(Math.Abs(yMax)) + 100
        End If

        'If maxXline > maxYline Then
        'pScale = drawGrafField.Width / maxXline
        'Else
        'pScale = drawGrafField.Width / maxYline
        'End If

        For i As Integer = 0 To pSc.GetUpperBound(0)
            pSc(i).X = p(i).X + cScrX
            pSc(i).Y = p(i).Y + cScrY
        Next
        drawGrafField.Height = maxYline '/ _scaleY
        drawGrafField.Width = maxXline '/ _scaleX
        CreatePolygon(drawGrafField.CreateGraphics)


    End Sub
    Private Sub drawGrafField_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles drawGrafField.MouseDown
        For i As Integer = 0 To pSc.GetUpperBound(0)
            If Math.Abs(pSc(i).X - e.X) < iCenter And _
               Math.Abs(pSc(i).Y - e.Y) < iCenter _
            Then
                ' Начинаем тащить
                CheckState = i
                Exit For
            End If
        Next i
    End Sub

    Private Sub drawGrafField_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles drawGrafField.MouseMove

        Me.Text = "x=" & Format(e.X - cScrX, "#.000";) & " м : y=" & Format(e.Y - cScrY, "#.000";) & " м"
        curX = System.Windows.Forms.Cursor.Position.X
        curY = System.Windows.Forms.Cursor.Position.Y
        Me.Text = Me.Text + "curX=" & Format(curX, "#.000";) & " м : curY=" & Format(curY, "#.000";) & " м"
        _mouse = e.Location

        drawGrafField.Invalidate()

        ' Ничего не делаем, если нет перемещения
        If CheckState = -1 Then Exit Sub
        ' Перемещаем вершины
        pSc(CheckState).X = e.X
        pSc(CheckState).Y = e.Y
        ' Перерисовываем
        CreatePolygon(drawGrafField.CreateGraphics())

        drawGrafField.Invalidate()
    End Sub
    Private Sub drawGrafField_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles drawGrafField.MouseUp
        CheckState = -1
    End Sub

    Private Sub drawGrafField_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles drawGrafField.MouseWheel
        ''попытка отловить событие "MouseWheel" неудачна, даже MsgBox не появляется(((
        MsgBox(e.Delta)
        If e.Delta > 0 Then
            drawGrafField.Scale(New SizeF(1.2, 1.2))
        Else
            drawGrafField.Scale(New SizeF(0.8, 0.8))
        End If
    End Sub

    Private Sub drawGrafField_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles drawGrafField.Paint
        e.Graphics.Transform = _matrix

        CreatePolygon(e.Graphics)
        For i As Integer = 0 To pSc.GetUpperBound(0)
            'e.Graphics.DrawEllipse(Pens.Red, pSc(i).X, pSc(i).Y, 3, 3)
            e.Graphics.DrawString(i + 1, _font, Brushes.Black, pSc(i).X, pSc(i).Y)
        Next

        'e.Graphics.DrawLines(Pens.Chocolate, pSc)
        e.Graphics.DrawCurve(Pens.Plum, pSc)
        '// Формируем текст
        ;Dim _text As String = String.Format("X = {0}" & vbNewLine & "Y = {1}", _
                                            _mouse.X - cScrX, _
                                            _mouse.Y - cScrY)
        '// Узнаем размеры прямоугольника, в который можно вписать текст
        ;Dim layoutSize As SizeF = e.Graphics.MeasureString(_text, _font)
        '// Создаем базовый прямоугольник
        ;Dim layoutRect As New Rectangle(_mouse.X + 20, _
                                        _mouse.Y, _
                                        layoutSize.Width, _
                                        layoutSize.Height)
        '// Смещаем его(прямоугольник) на 5 пикселов для вывода тени
        layoutRect.Offset(5, 5)
        '// Заливаем тень
        e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(30, Color.RoyalBlue)), _
                                 layoutRect)
        '// Возвращаем прямоугольник обратно
        layoutRect.Offset(-5, -5)
        '// Заливаем фон
        e.Graphics.FillRectangle(Brushes.White, _
                                 layoutRect)
        '// Рисуем рамку
        e.Graphics.DrawRectangle(Pens.RoyalBlue, _
                                 layoutRect)
        '// Рисуем текст
        e.Graphics.DrawString(_text, _
                              _font, _
                              Brushes.Black, _
                              layoutRect)
        drawGrafField.Invalidate()
    End Sub
    Private Sub CreatePolygon(ByVal g As Graphics)
        ' Рисуем метки, за которые можно ухватиться мышкой
        ;Dim rectangles() As Rectangle
        ReDim rectangles(pSc.GetUpperBound(0))
        For i As Integer = 0 To pSc.GetUpperBound(0)
            ' Определяем размеры меток и их центры
            With rectangles(i)
                .X = pSc(i).X - iCenter
                .Y = pSc(i).Y - iCenter
                .Width = iSize
                .Height = iSize
            End With
        Next i

        ' Заполняем метки белым цветом и обрамляем их черным цветом
        g.FillRectangles(Brushes.White, rectangles)
        g.DrawRectangles(Pens.Red, rectangles)
    End Sub
End Class

Код сырой, проект только начинается, полно всего лишнего.
Жду ваших предложений и помощи.

Ответить

Номер ответа: 4
Автор ответа:
 topograf



Вопросов: 3
Ответов: 12
 Профиль | | #4 Добавлено: 10.10.09 15:38
Вот картинка при значении переменной _scale=3

http://s53.radikal.ru/i139/0910/e0/fe8b97f83436.jpg

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 11.10.09 13:44
Ссылка на тему передана лично EROS'у

Ответить

Номер ответа: 6
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #6 Добавлено: 12.10.09 10:10
а как называется контрол, не дадите ссылку?

Ответить

Номер ответа: 7
Автор ответа:
 topograf



Вопросов: 3
Ответов: 12
 Профиль | | #7 Добавлено: 12.10.09 11:44
Artyom Спасибо.

fifa36 вот ссылка на тему, а там ссылка на проект с контролом.
http://www.vbnet.ru/forum/show.aspx?id=134515

Ответить

Номер ответа: 8
Автор ответа:
 topograf



Вопросов: 3
Ответов: 12
 Профиль | | #8 Добавлено: 12.10.09 11:53
ссылка на контрол http://kbyte.ru/Samples/Show.aspx?id=272

Ответить

Номер ответа: 9
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #9 Добавлено: 13.10.09 11:42
 topograf спасибо!

Ответить

Номер ответа: 10
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 13.10.09 18:41
Во, блин.. ну вы, народ даете.. этот проект писался давным давно для освоения GDI+ к тому же он написан на VB, на котором я уже очень давно не пишу.. Так что сорри.. исходники там есть, а больше ничем помочь не могу..

Ответить

Номер ответа: 11
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #11
Добавлено: 19.10.09 13:15
Кстати, есть подобный контрол. С мануалом и примером использования. http://ifolder.ru/14568167

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам