Страница: 1 |
|
Вопрос: Вопрос к EROS'у
|
Добавлено: 10.10.09 01:32
|
|
Автор вопроса: topograf
|
Нашел на сайте твой контрол для построения графиков.
Контрол интересный, супер.
Нужна твоя помошь!!!
Как на графике отобразить координаты курсора, с точностью до миллиметра(н-р х=1.236: у=10.265)? Как его увеличивать/уменьшать в отклик на событие "MouseWheel"?
Надеюсь на ответ.
И остальные спецы подтягивайтесь)))
Очень нужна ваша помощь!!!
Ответить
|
Номер ответа: 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
 own
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)
'// Формируем текст
 im _text As String = String.Format("X = {0}" & vbNewLine & "Y = {1}", _
_mouse.X - cScrX, _
_mouse.Y - cScrY)
'// Узнаем размеры прямоугольника, в который можно вписать текст
 im layoutSize As SizeF = e.Graphics.MeasureString(_text, _font)
'// Создаем базовый прямоугольник
 im 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)
' Рисуем метки, за которые можно ухватиться мышкой
 im 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
Ответить
|
Номер ответа: 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 спасибо!
Ответить
|
Страница: 1 |
Поиск по форуму