2 Brand
АлександР пишет не на дотнете, я понятия не имею, что там в дотнете по поводу GDI, но даже если и есть что-то, в vb6 всёравно придётся на чистом апи всё делать...
В .NET можно использовать GDI, я же говорил - вызовы обычных АПИ не отменили,
Слушай, Brand, я только от тебя слышу такие тезисы. Может всё-таки намекнёшь или ключевое словечко дашь, как это делать? (только не говори, что LineTo)
Ну так это ни чем не лучше джидай-варианта. Я уже пробовал. На джиде+() и то получше/ Это то же, что на vb6 юзать .line. Пробовал - но не получилось. И у тебя - не получится. (ну или получится то же, что и у меня) Т.к. ты тему не хочешь с начала прочитать, сморти овт № 34.
Да и вообще. Я под GDI c самого начала понимал прежде всего line как элемент управления, который существует VB6. А не методы. А ты?
Я не знаю, что ты там понимаешь под GDI, это твои проблемы.
GDI - это интерфейс, через который можно что-то рисовать, вот и все, хочешь ты этого или нет.
Когда мне говорили, что это сделать невозможно, я брал и делал то что сделать невозможно (с) Р. Киосаки
Ты мудр. Мне нравится твоя хватка. Если человек так говорит - значит судьба клыбается ему, и он сделает это. Поэтому
Берись.
Я согласен на условия.
Но только смотри: основные пункты ТЗ
1)событие mousedown на контейнере
2)событие mousemove на контейнере
3)свойство width
Пусть этот код будет опубликован в этой теме. И мы его обсудим. Заодно - голосованием выберем победителя в споре, а точнее - справился ли ты с заданием или нет?
Ok?
P.S. Хотелось бы знать ради любопытства, это будет контрол?
Не знаю, чем вам регионы не угодили, только что попробовал сделать через регион - вполне нормально работает, никаких тормозов не наблюдается.
Вот набросок, линия делается из PictureBox, при ресайзинге никаких жутких тормозов не замечено.
Для более корректного отображения ширины нужно будет ненмого тригонометрию заюзать.
Public Class Form1
Const LineWidth As Integer = 10
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub PictureBox1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Resize
Dim Pth As New Drawing2D.GraphicsPath
Dim Points(3) As Point
Points(0) = New Point(0, -LineWidth)
Points(1) = New Point(PictureBox1.Width + LineWidth, PictureBox1.Height)
Points(2) = New Point(PictureBox1.Width, PictureBox1.Height + LineWidth)
Points(3) = New Point(-LineWidth, 0)
Pth.AddPolygon(Points)
Dim Rgn As New Region(Pth)
PictureBox1.Region = Rgn
End Sub
End Class
Увы, в этом варианте будет очень сложно добиться антиалиасинга.
т.е. возможно, но тормоза уже будут ощутимы.
Другой вариант который я планировал реализовывать - контрол делается невидимым, подписываемся на событие OnPaint контейнера, при отрисовке рисуем саму линию (уже можно заюзать антиалисаинг), также подписываемся на события MouseMove и MouseDown, при их наступлении проверяем координаты X и Y на факт вхождения/невхождения курсора мыши в линию.
то на чем лежит контрол... Я написал контрол VB6, который поддерживает события mouse... Но m/down работает только дя этого контрола. Я делал невидимым как только мог! И все же m/down контейнера (т. е. того, на чем лежит этот контрол - на работало, напр form1)/ Контрол был растянут на весь контейнер и я сделал событие down для него самого - заработало, в то время, как move - работал для контейнера. По видимому этои события хотя и похожи но работают совершенно по разному. Этот недостаток я не мог искоренить. И поэтому и стал искать другие пути - поэтому и подчеркиваю, что
1)событие mousedown на контейнере
2)событие mousemove на контейнере
Мой контрол - здесь:http://sobaka710.narod.ru/lineControl1.rar
Регионы очень сильно тормозили в том случае, если их таскать методами m/move, m/down по форме... ( по кр мере на VB6). Я здесь набросал на VB8. Следующийкод не работает:
Option Explicit On
Public Class Form1
Dim x1 As Single, x2 As Single, y1 As Single, y2 As Single
Const LineWidth As Integer = 10
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
x1 = e.X : y1 = e.Y
Label1.Text = "5"
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
x2 = e.X : y2 = e.Y
End Sub
Private Sub PictureBox1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Resize
Dim Pth As New Drawing2D.GraphicsPath
Dim Points(3) As Point
Points(0) = New Point(x1, y1)
Points(1) = New Point(x2, y2)
Points(2) = New Point(PictureBox1.Width, PictureBox1.Height + LineWidth)
Points(3) = New Point(-LineWidth, 0)
Pth.AddPolygon(Points)
Dim Rgn As New Region(Pth)
PictureBox1.Region = Rgn
End Sub
End Class
Я еще не перестроился с VB6: как сделать чтобы m/move, m/down работали - не сумел в этом примере. Но думаю, что ты понял, что я имел ввиду, когда говорил "таскать по форме событиями mouse..." Попробуй - как будет тормозить или нет? Стоит идти этим путём или нет?
Увы, в этом варианте будет очень сложно добиться антиалиасинга.
т.е. возможно, но тормоза уже будут ощутимы.
Прошу прощения за неиррудированность: антиалиасинг - это что?
Другой вариант который я планировал реализовывать - контрол делается невидимым, подписываемся на событие OnPaint контейнера, при отрисовке рисуем саму линию (уже можно заюзать антиалисаинг), также подписываемся на события MouseMove и MouseDown, при их наступлении проверяем координаты X и Y на факт вхождения/невхождения курсора мыши в линию.
Посмотри сначала мой контрол на VB6, на который я дал ссылку: не будет повторения истории?
Но только смотри: основные пункты ТЗ
1)событие mousedown на контейнере
2)событие mousemove на контейнере
3)свойство width
Забудь о ТЗ. У меня их всешда не получалось писать; поэтому дубль двапрошу прощения за нерасторопность)
1)событие mousedown для самой линии
2)событие mousemove для самой линии
3)свойство width для самой линии
И как условие, которое должно быть:
4)mousedown на контейнере
5)mousemove на контейнере