EROS
да в том-то и дело, что в НЕТ нету тех вещей, который еще есть в ВБ6: а именно линии, в ней вся фишка.
Я полгода искал способ реализовать её через НЕТ, и пришел только к избыточным АПИ rgn-ирования окон (а АПИ в .Net кстати медленнее работаю, уже "-" и невероятному алгоритму их реализации (толщина - не что иное, как олгоритм комланарности линий, с его реализацией я тоже порядочно намучался, нормальный он так у меня и не получился )
да в том-то и дело, что в НЕТ нету тех вещей, который еще есть в ВБ6: а именно линии
Возможно, я не понимаю о каких линиях ты говоришь, но в НЕТ есть , как минимум, 4 метода DrawLine и 2 метода DrawLines, которые с лихвой перекроют метод Line из VB6. Это те методы, которые в чистом виде работают с линиями и позволяют устанавливать и координаты, и цвет, и толщину и т.д. Кроме того есть масса методов, которые используют линии косвенно.. Вплоть до того, что ты можешь с легкостью рисовать дуги,эллипсы,кривые Безье, да вообще все,что душе угодно! На мой взгляд возможности GDI.NET несравнимо выше с теми, что предоставлял в свое время VB6. По всей видимости просто у тебя недостаточно опыта,чтобы это реализовать на NET(без обид).
Опиши конкретно задачу, которую ты не смог сделать на NET, и подумаем вместе..
а АПИ в .Net кстати медленнее работают
Тут я с тобой полностью согласен, и так же я был разочарован этим при переходе с 6-ки.. Но длилось это не долго.. до тех пор пока не осознал, что NET предоставляет методы,которые реализуют вызов необходимых API. И за последний год, у меня лично ни разу не возникла ситация где бы понадобился прямой вызов API.. Везде я с легкостью обошелся встроенными средствами NET.
И таскать за собой ocx, написанный на 6-ке (без веских причин) имхо, в корне не верное решение.. И кроме как тормозов при вызовах он тебе ничего не добавит...
Опиши конкретно задачу, которую ты не смог сделать на NET, и подумаем вместе..
Спасибо за предложение!
Возможно, я не понимаю о каких линиях ты говоришь, но в НЕТ есть , как минимум, 4 метода DrawLine и 2 метода DrawLines, которые с лихвой перекроют метод Line из VB6.
Так и есть, я говорю не о методе линия, а о контроле Линия, который в вб6 явл. в стандартном наборе. В вбюнет аналога ей нет.
Мне нужен именно контрол(!),...
Графические методы вб.нет с одной стороны заставляют себя уважать, с другой, устрашают. Т. к. вместо line()-(), теперь как минимум нужно писать четыре строчки.
'объявляем графические переменные
Dim formGraphics As System.Drawing.Graphics
formGraphics = pctMain.CreateGraphics()
'обращаемся к ним
formGraphics.DrawLine(Pens.Blue, 100, 100, txt + 100, 100)
'освобождаем память
formGraphics.Dispose()
На мой взгляд это загромождает код. (хотя теперь привык, нормально)
Но в сравнение с контролом они в сравнение не идут ((((
К контрлу (то есть к каждой нарисованной лиинии )можно
обратиться по имени и изменить положение линии
-цвет
-толщину
и т д
->значит можно использовать ее как объект. Легко писать программы для работы с ним... и т д.
-объектная привязка...
-обработка событий mousemove/mousedown и т д...
Разговор о графических методах был бы актуален только в том случае, если бы моно было как-то придать окну форму нарисованного на ней... - но такой метод есть только для окон верхнего уровня ((
И таскать за собой ocx, написанный на 6-ке (без веских причин) имхо, в корне не верное решение..
ИМХО из причин, перечисленных выше, есть существенные.
Но длилось это не долго.. до тех пор пока не осознал, что NET предоставляет методы,которые реализуют вызов необходимых API.
всегда хотел спросить, а эти методы в вб.нет быстрее, чем АПИ в вб6?
вместо line()-(), теперь как минимум нужно писать четыре строчки
Это смотря в каком методе юзать.. К примеру в Paint or PaintBackground (а именно в Paint правильнее всего распологать вызов графических функций) достаточно одной строчки.
К контролу (то есть к каждой нарисованной лиинии )можно ...
А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?
Разговор о графических методах был бы актуален только в том случае, если бы моно было как-то придать окну форму нарисованного на ней... - но такой метод есть только для окон верхнего уровня ((
Тут я позволю себе не согласиться с тобой по двум причинам..
1. Что мешает тебе сделать твой контрол прозрачным и рисовать на нем все что угодно?(как бы иммитируя регион)
2. У любого контрола есть наследованное свойство Region, через которое ты можешь с легкостью обрезать свой контрол (именно контрол а не форму) по нужным тебе габаритам. Вплоть до того, что создать Region из Bitmapa'a.. либо обойтись стандартными фигурами.. (эллипс, прямоугольник и т.д.) либо комбинируя и то и другое..
всегда хотел спросить, а эти методы в вб.нет быстрее, чем АПИ в вб6?
Не могу ничего сказать по этому поводу.. ибо для проведения тестов необходимо иметь 2 среды разработки.. А ставить ради этого 6-ку... увольте.. не хочу вспоминать этот страшный сон трехлетней давности..
И вот еще что.. Кроме всего прочего через свойство Clip, ты можешь ограничить область вывода графики.. (почти тоже самое что и регионирование)..
Так что тебе надо лишь определиться с требованиями к твоему контролу и выбрать наиболее подходящее решение..
а именно в Paint правильнее всего распологать вызов графических функций)
Так как же в paint располагать то, что должно обрабатываться другими собыитями?
А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?
Как?
1. Что мешает тебе сделать твой контрол прозрачным и рисовать на нем все что угодно?(как бы иммитируя регион)
Так нарисованное же тоже будет прозрачным, а значит его не будет видно. По-кр. мере так в вб6, неужели вб.нет настолько(!!!) другой?
2. У любого контрола есть наследованное свойство Region, через которое ты можешь с легкостью обрезать свой контрол (именно контрол а не форму) по нужным тебе габаритам. Вплоть до того, что создать Region из Bitmapa'a.. либо обойтись стандартными фигурами.. (эллипс, прямоугольник и т.д.) либо комбинируя и то и другое..
ну это то же, о чем я уже писал...
Я полгода искал способ реализовать её через НЕТ, и пришел только к избыточным АПИ rgn-ирования окон (а АПИ в .Net кстати медленнее работаю, уже "-" и невероятному алгоритму их реализации (толщина - не что иное, как олгоритм комланарности линий, с его реализацией я тоже порядочно намучался, нормальный он так у меня и не получился )
Проблема не rgnировании, а в этих алгоритмах, которыми нужно его сопровождать... ((
Так как же в paint располагать то, что должно обрабатываться другими собыитями?
Да очень просто.. например тебе надо нарисовать координаты мыши.. соответсвенно обрабатывать ты будешь MouseMove. Для этого в MouseMove запоминаешь в переменных уровня формы координаты мыши и вызываешь метод Invalidate, который в свою очередь запустит процедуру Paint. А вот уже в ней считываешь запомненные ранее координаты и рисуешь на форме. Вот и весь фокус, и дальше по аналогии. А если распологать НЕ в Paint, то изображение будет постоянно затираться, если только ты не сделаешь из него Bitmap.
Так нарисованное же тоже будет прозрачным, а значит его не будет видно. По-кр. мере так в вб6, неужели вб.нет настолько(!!!) другой?
Именно настолько и другой.. А причина этому поведению заключается в том, что процедуры прорисовки фона и основной части разделены. И ты можешь совершенно спокойно рисовать все что тебе надо на абсолютно прозрачном фоне.. Все что ты для этого должен сделать, так это задать соответствующий стиль окна и переопределить процедуру прорисовки фона..
А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?
Как?
''' <summary>
''' VS 2005
''' Control with transparent color example
''' </summary>
''' <remarks>EROS Nizhniy Novgorod</remarks>
Public Class Line
Inherits Control
'// Объвляем нужные события
Public Event LineWidthChanged As EventHandler
Protected Overrides ReadOnly Property DefaultSize() As Size
Get
'// Переопределяем начальный размер
Return New Size(100, 100)
End Get
End Property
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
'// Переопределяем стиль контрола
Dim param As CreateParams = MyBase.CreateParams
param.ExStyle = param.ExStyle Or &H20
Return param
End Get
End Property
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
'// Задаем качество
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
'// Рисуем афигенную линию...
Dim myPen As New Pen(MyBase.ForeColor, _Width)
e.Graphics.DrawLine(myPen, 0, 0, Me.Width, Me.Height)
'// Убиваем ненужные объекты
myPen.Dispose()
'// Отправляем сообщение дальше
MyBase.OnPaint(e)
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
'// Нифига не делаем, чтоб Background не прорисовывался(но переопределить надо)
End Sub
Protected Sub InvalidateEx()
'// Перерисовываем родителя, а он перерисует наш контрол
If Parent IsNot Nothing Then Parent.Refresh()
End Sub
#Region " My Custom Property's"
Private _Width As Single = 1
<efaultValue(GetType(Single), "1", _
 escription("The width of the line", _
Category("Appearance"> _
Public Property LineWidth() As Single
Get
Return _Width
End Get
Set(ByVal Value As Single)
'// Проверяем что нам подсунули (если надо) и запоминаем
_Width = Value
'// Перерисовываемся
InvalidateEx()
'// Инициируем событие
RaiseEvent LineWidthChanged(Me, EventArgs.Empty)
End Set
End Property
#End Region
End Class
Я реализовал для примера только 2 свойства.. толщину и цвет линии плюс добавил прозрачности,чтоб ты понял как это работает. Разумеется тебе необходимо будет сделать процедуру пересчета размеров контрола и его положения в контейнере относительно начальных и конечных точек линии. Я реализовал основную идею, а детали я думаю у тебя не должны вызвать трудностей..
пришел только к избыточным АПИ rgn-ирования окон
Никакие API тут абсолютно не нужны, все можно решить через встроенные средства..
Проблема не rgnировании, а в этих алгоритмах, которыми нужно его сопровождать... ((
Что за алгоримы? Опиши подробней типичный алгоритм, который вызвал и тебя трудности..
Для этого в MouseMove запоминаешь в переменных уровня формы координаты мыши и вызываешь метод Invalidate, который в свою очередь запустит процедуру Paint. А вот уже в ней считываешь запомненные ранее координаты и рисуешь на форме.
что-то не так: (я нав. понял слишком буквально )
Private Sub pctMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pctMain.MouseMove
x = e.X
y = e.Y
Invalidate()
End Sub
Private Sub pctMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pctMain.Paint
'обновляем (очищаем) изображение
'pctMain.Refresh()
'объявляем графические переменные
Dim formGraphics As System.Drawing.Graphics
formGraphics = pctMain.CreateGraphics()
'обращаемся к ним
formGraphics.DrawLine(Pens.Blue, 100, 100, x, y)
'освобождаем память
formGraphics.Dispose()
End Sub
Именно настолько и другой.. А причина этому поведению заключается в том, что процедуры прорисовки фона и основной части разделены. И ты можешь совершенно спокойно рисовать все что тебе надо на абсолютно прозрачном фоне.. Все что ты для этого должен сделать, так это задать соответствующий стиль окна и переопределить процедуру прорисовки фона..
Я реализовал для примера только 2 свойства.. толщину и цвет линии плюс добавил прозрачности,чтоб ты понял как это работает. Разумеется тебе необходимо будет сделать процедуру пересчета размеров контрола и его положения в контейнере относительно начальных и конечных точек линии. Я реализовал основную идею, а детали я думаю у тебя не должны вызвать трудностей..
счас займусь твоим примером, буду его старательно изучать...
Научишь?
потом, после того, как я с ним разберусь... а то слишком много надо пережевать
Все, получилось, спасибо. По примеру интересно, особенно меня удивило такое расположение:
Private Sub pctMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pctMain.MouseMove
x = e.X
y = e.Y
'обновляем (очищаем) изображение
pctMain.Refresh()
'объявляем графические переменные
Dim formGraphics As System.Drawing.Graphics
formGraphics = pctMain.CreateGraphics()
'обращаемся к ним
formGraphics.DrawLine(Pens.Blue, 100, 100, x, y)
'освобождаем память
formGraphics.Dispose()
'pctMain.Invalidate()
End Sub
Private Sub pctMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pctMain.Paint
e.Graphics.DrawLine(Pens.Blue, 0, 100, x, y)
End Sub
Спасибо!
И работает и так и так без метода invalidate, кстати для чего он нужен?
Его перевод с английского как-то не соответствует его функции
Я реализовал для примера только 2 свойства.. толщину и цвет линии плюс добавил прозрачности,чтоб ты понял как это работает.
Насколько я понял, прозрачность реализуют эти строки:
'// Переопределяем стиль контрола
Dim param As CreateParams = MyBase.CreateParams
param.ExStyle = param.ExStyle Or &H20
Return param
Но если сделать так, то оказвыается что
Private Sub Line1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Line1.MouseMove
Beep()
End Sub