Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Как использовать ocx написанный на VB6 Добавлено: 29.12.06 20:02  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Как использовать ocx написанный на VB6 в VB.Net?

Я делал так: Project->Add Reference->Browse, только я не понял, что дальше. В ToolBox я его не нашел
?????????????????????????????

Подскажите, пожалста

Заранее спссибо!

Ответить

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

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



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #1 Добавлено: 29.12.06 20:31
Правой кнопкой по тулбоксу -> Add/Remove items -> COM Components. Само собой OCX должен быть зарегистрирован.

Ответить

Номер ответа: 2
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #2
Добавлено: 29.12.06 21:34
Рулит

Спасибо, Arseny.

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 30.12.06 00:53
(имхо) только все же правильнее будет переписать его под НЕТ.. (если это самописный ocx).. хлопот потом меньше будет..

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 30.12.06 09:52
EROS
да в том-то и дело, что в НЕТ нету тех вещей, который еще есть в ВБ6: а именно линии, в ней вся фишка.

Я полгода искал способ реализовать её через НЕТ, и пришел только к избыточным АПИ rgn-ирования окон (а АПИ в .Net кстати медленнее работаю, уже "-";) и невероятному алгоритму их реализации (толщина - не что иное, как олгоритм комланарности линий, с его реализацией я тоже порядочно намучался, нормальный он так у меня и не получился :( )

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 30.12.06 10:15
да в том-то и дело, что в НЕТ нету тех вещей, который еще есть в ВБ6: а именно линии

Возможно, я не понимаю о каких линиях ты говоришь, но в НЕТ есть , как минимум, 4 метода DrawLine и 2 метода DrawLines, которые с лихвой перекроют метод Line из VB6. Это те методы, которые в чистом виде работают с линиями и позволяют устанавливать и координаты, и цвет, и толщину и т.д. Кроме того есть масса методов, которые используют линии косвенно.. Вплоть до того, что ты можешь с легкостью рисовать дуги,эллипсы,кривые Безье, да вообще все,что душе угодно! На мой взгляд возможности GDI.NET несравнимо выше с теми, что предоставлял в свое время VB6. По всей видимости просто у тебя недостаточно опыта,чтобы это реализовать на NET(без обид).
Опиши конкретно задачу, которую ты не смог сделать на NET, и подумаем вместе..
а АПИ в .Net кстати медленнее работают

Тут я с тобой полностью согласен, и так же я был разочарован этим при переходе с 6-ки.. Но длилось это не долго.. до тех пор пока не осознал, что NET предоставляет методы,которые реализуют вызов необходимых API. И за последний год, у меня лично ни разу не возникла ситация где бы понадобился прямой вызов API.. Везде я с легкостью обошелся встроенными средствами NET.
И таскать за собой ocx, написанный на 6-ке (без веских причин) имхо, в корне не верное решение.. И кроме как тормозов при вызовах он тебе ничего не добавит...

Ответить

Номер ответа: 6
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #6
Добавлено: 30.12.06 23:29
Опиши конкретно задачу, которую ты не смог сделать на 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?

Ответить

Номер ответа: 7
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #7
Добавлено: 30.12.06 23:32
По всей видимости просто у тебя недостаточно опыта,чтобы это реализовать на NET(без обид).
В полне возможно!

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 31.12.06 04:30
вместо line()-(), теперь как минимум нужно писать четыре строчки


Это смотря в каком методе юзать.. К примеру в Paint or PaintBackground (а именно в Paint правильнее всего распологать вызов графических функций) достаточно одной строчки.

К контролу (то есть к каждой нарисованной лиинии )можно ...

А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?

Разговор о графических методах был бы актуален только в том случае, если бы моно было как-то придать окну форму нарисованного на ней... - но такой метод есть только для окон верхнего уровня :(((

Тут я позволю себе не согласиться с тобой по двум причинам..
1. Что мешает тебе сделать твой контрол прозрачным и рисовать на нем все что угодно?(как бы иммитируя регион)
2. У любого контрола есть наследованное свойство Region, через которое ты можешь с легкостью обрезать свой контрол (именно контрол а не форму) по нужным тебе габаритам. Вплоть до того, что создать Region из Bitmapa'a.. либо обойтись стандартными фигурами.. (эллипс, прямоугольник и т.д.) либо комбинируя и то и другое..

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 31.12.06 04:37
всегда хотел спросить, а эти методы в вб.нет быстрее, чем АПИ в вб6?

Не могу ничего сказать по этому поводу.. ибо для проведения тестов необходимо иметь 2 среды разработки.. А ставить ради этого 6-ку... увольте.. не хочу вспоминать этот страшный сон трехлетней давности..

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 31.12.06 11:12
И вот еще что.. Кроме всего прочего через свойство Clip, ты можешь ограничить область вывода графики.. (почти тоже самое что и регионирование)..
Так что тебе надо лишь определиться с требованиями к твоему контролу и выбрать наиболее подходящее решение..

Ответить

Номер ответа: 11
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #11
Добавлено: 31.12.06 13:12
а именно в Paint правильнее всего распологать вызов графических функций)
Так как же в paint располагать то, что должно обрабатываться другими собыитями?

А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?
Как?

1. Что мешает тебе сделать твой контрол прозрачным и рисовать на нем все что угодно?(как бы иммитируя регион)
Так нарисованное же тоже будет прозрачным, а значит его не будет видно. По-кр. мере так в вб6, неужели вб.нет настолько(!!!) другой?

2. У любого контрола есть наследованное свойство Region, через которое ты можешь с легкостью обрезать свой контрол (именно контрол а не форму) по нужным тебе габаритам. Вплоть до того, что создать Region из Bitmapa'a.. либо обойтись стандартными фигурами.. (эллипс, прямоугольник и т.д.) либо комбинируя и то и другое..
ну это то же, о чем я уже писал...

Я полгода искал способ реализовать её через НЕТ, и пришел только к избыточным АПИ rgn-ирования окон (а АПИ в .Net кстати медленнее работаю, уже "-";) и невероятному алгоритму их реализации (толщина - не что иное, как олгоритм комланарности линий, с его реализацией я тоже порядочно намучался, нормальный он так у меня и не получился :( )
Проблема не rgnировании, а в этих алгоритмах, которыми нужно его сопровождать... :(((

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 31.12.06 21:43
Так как же в paint располагать то, что должно обрабатываться другими собыитями?

Да очень просто.. например тебе надо нарисовать координаты мыши.. соответсвенно обрабатывать ты будешь MouseMove. Для этого в MouseMove запоминаешь в переменных уровня формы координаты мыши и вызываешь метод Invalidate, который в свою очередь запустит процедуру Paint. А вот уже в ней считываешь запомненные ранее координаты и рисуешь на форме. Вот и весь фокус, и дальше по аналогии. А если распологать НЕ в Paint, то изображение будет постоянно затираться, если только ты не сделаешь из него Bitmap.

Так нарисованное же тоже будет прозрачным, а значит его не будет видно. По-кр. мере так в вб6, неужели вб.нет настолько(!!!) другой?

Именно настолько и другой.. А причина этому поведению заключается в том, что процедуры прорисовки фона и основной части разделены. И ты можешь совершенно спокойно рисовать все что тебе надо на абсолютно прозрачном фоне.. Все что ты для этого должен сделать, так это задать соответствующий стиль окна и переопределить процедуру прорисовки фона..

А что мешает тебе создать класс, наследовать его от Control, добавить необходимые примочки(толщину, цвет и т.д.) и юзать его?
Как?

Да хотя бы примерно так...
Imports System.Drawing
Imports System.ComponentModel

''' <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
    <;DefaultValue(GetType(Single), "1";), _
    ;Description("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ировании, а в этих алгоритмах, которыми нужно его сопровождать... :(((


Что за алгоримы? Опиши подробней типичный алгоритм, который вызвал и тебя трудности..

Ответить

Номер ответа: 13
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #13
Добавлено: 01.01.07 16:55
Для этого в 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


Именно настолько и другой.. А причина этому поведению заключается в том, что процедуры прорисовки фона и основной части разделены. И ты можешь совершенно спокойно рисовать все что тебе надо на абсолютно прозрачном фоне.. Все что ты для этого должен сделать, так это задать соответствующий стиль окна и переопределить процедуру прорисовки фона..
Круто! Надо будет этим заняться. Научишь?

Ответить

Номер ответа: 14
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #14
Добавлено: 01.01.07 17:03
Я реализовал для примера только 2 свойства.. толщину и цвет линии плюс добавил прозрачности,чтоб ты понял как это работает. Разумеется тебе необходимо будет сделать процедуру пересчета размеров контрола и его положения в контейнере относительно начальных и конечных точек линии. Я реализовал основную идею, а детали я думаю у тебя не должны вызвать трудностей..
счас займусь твоим примером, буду его старательно изучать...

Научишь?
потом, после того, как я с ним разберусь... а то слишком много надо пережевать

Ответить

Номер ответа: 15
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #15
Добавлено: 01.01.07 18:33
что-то не так: (я нав. понял слишком буквально :) )
Все, получилось, спасибо. По примеру интересно, особенно меня удивило такое расположение:
    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
он вовсе не прозрачный

Ответить

Страница: 1 | 2 |

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



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