Создание первого ActiveX элемента.

Домой Наверх Предыдущий Следующий

Добавление методов для ActiveX-элементов

В этом разделе мы, наконец-то, займёмся рисованием нашей звезды. Для этого в окне кода для нашего ActiveX-элемента (повторяться не хочется, но, пожалуйста, не совершите типичной и распространенной ошибки - весь код надо добавлять в ActiveX-элемент, а не в тестовую форму Form1!) добавьте следующие строки:

Public Sub DrawStar(n As Integer, m As Integer)

Dim i As Integer

Dim x As Integer

Dim y As Integer

Dim m_intR As Integer 'радиус звезды

Cls 'очистка экрана

x = UserControl.Width / 2

y = UserControl.Height / 2

If x > y Then

m_intR = y

Else

m_intR = x

End If

For i = 0 To n - 1

Line (x + Cos(i * 6.283 / n) * m_intR, _

y + Sin(i * 6.283 / n) * m_intR)- _

(x + Cos((i + m) * 6.283 / n) * m_intR, _

y + Sin((i + m) * 6.283 / n) * m_intR)

Next i

End Sub

Прокомментируем эту процедуру. Как ясно из её названия, она рисует нашу правильную звезду на форме. В процедуру передаётся два параметра - целые n и m. n - это количество лучей у рисуемой звезды, m - это через сколько вершин происходит соединение вершин звезды (если эта фраза непонятна, то перечитайте раздел постановка задачи).

Размер звезды будет зависеть от размера нашего ActiveX-элемента, а именно звезда будет максимально возможного размера, который может поместиться в прямоугольнике, ограничивающем наш ActiveX-элемент. Для этого мы вводим переменные x и y целого типа, в которые мы записываем половинные значения для ширины и высоты нашего ActiveX-элемента соответственно. В приведенном тексте это строчки

x = UserControl.Width / 2

y = UserControl.Height / 2

Затем в строчках

If x > y Then

m_intR = y

Else

m_intR = x

End If

мы записываем в переменную m_intR (это радиус звезды) минимум из x и y. Таким образом радиус нашей звезды не будет превышать половины минимального измерения, наша звезда полностью впишется в прямоугольник и будет полностью видна.

Теперь самая сложная для понимая часть - непосредственное рисование звезды.

Если у звезды n вершин, то для её рисования нам надо провести n отрезков. Конечно, это лучше всего делать в цикле. Цикл должен провращаться n раз, поэтому в качестве условия цикла мы пишем

For i = 0 To n - 1

...

Next i

(Почему мы начали наш цикл с нуля а не с единицы? По привычке, которая идет от языка C/C++ . Но если Вам больше нравится, то можете вместо первой строчки записать

For i = 1 To n

- эффект будет тот же самый.)

Каждый раз внутри цикла мы проводим очередную сторону нашей звезды. Разберём этот фрагмент более подробно.

Соединение вершин мы производим с помощью оператора Line. Как известно, синтаксис у него таков:

Line (x1, y1) - (x2, y2),

где (x1, y1) - координаты начала отрезка и (x2, y2) - координаты конца. (Мы специально разбили эту строчку на четыре, чтобы нам было легче сопоставлять её с текстом нашей процедуры.)

Сначала мы ищем координаты начала нашей стороны. Для этого берём число 6.283 , делим его на n (что соответствует делению окружности на n равных частей) и для получения i-той вершины умножаем на i (напоминаем, что i - это счетчик цикла, так что мы каждый раз при прохождении цикла будем получать очередную вершину). Теперь от полученного выражения i * 6.283 / n мы берём либо косинус (для нахождения x-ой координаты), либо синус (для нахождения y-ой координаты):

Cos(i * 6.283 / n)

Sin(i * 6.283 / n)

Полученные координаты сторон мы умножаем на радиус окружности m_intR :

Cos(i * 6.283 / n)*m_intR

Sin(i * 6.283 / n)*m_intR

Но это ещё не всё. Наша окружность (в которую мы вписываем звезду) должна располагаться точно посередине ActiveX-элемента, т. е. её центр должен находится в точке с координатами x и y (напомним, что x и y - это половина ширины и высоты нашего ActiveX-элемента соответственно) Поэтому к координатам сторон мы ещё прибавляем x и y:

x + Cos(i * 6.283 / n)*m_intR

y + Sin(i * 6.283 / n)*m_intR

Вот это и есть окончательные координаты первого конца отрезка (он же сторона нашей звезды).

Для второго конца отрезка (стороны нашей звезды) рассуждения точно такие же, только мы должны умножить не на i, а на i+m, где m - это второй параметр нашей процедуры, показывающий, через сколько вершин происходит соединение:

x + Cos((i+m) * 6.283 / n)*m_intR

y + Sin((i+m) * 6.283 / n)*m_intR

Получив координаты двух концов нашей стороны, мы соединяем их, используя оператор Line.

Теперь вставим написанную процедуру в некоторые уже написанные места. Когда мы должны рисовать нашу звезду? Например тогда, когда мы меняем на этапе разработки программы значения n или m в окне свойств (рис. 10). Для этого измените Property Get и Property Set следующим образом:

Public Property Get n() As Integer

n = m_intN

DrawStar m_intN, m_intM

End Property

Public Property Let n(New_N As Integer)

m_intN = New_N

DrawStar m_intN, m_intM

End Property

Public Property Get m() As Integer

m = m_intM

End Property

Public Property Let m(New_M As Integer)

m_intM = New_M

DrawStar m_intN, m_intM

End Property

На данном этапе с кодом всё. Более писать мы ничего в нашем коде не будем (пока!), зато скажем несколько общих слов.

Возможно что за обсуждаемыми мелкими и частыми деталями Вы забыли, как называется этот раздел. А называется он "Добавление методов для ActiveX-элементов". Так вот, процедура DrawStar, которую мы сейчас написали, как раз методом и является, т. е. задачу нашу мы выполнили. Для того, что бы убедиться в этом, щёлкните на форме Form1, сделав её активной, и затем нажмите F2 для вызова Object Browser'а (или выберете меню View->Object Browser или нажмите соответствующую кнопку на панели инструментов Standard). В верхнем ниспадающем списке появившегося окна Object Browser'а выберете MyStar. В главной части окна Object Browser'а (она самая большая), в левой части, у Вас должно оказаться два элемента - Globals и Star. Щёлкните на Star и в правой части окна Object Browser'а Вы должны увидеть в списке методов, свойств и событий том числе и Ваш только что добавленный метод (рис. 11).

Этот же метод будет появляться и в ниспадающих списках-подсказках при использовании текста программы. Например если Вы в тексте программы, использующей Ваш ActiveX-элемент Star1 (например, в нашей тестовой программе с главной формой Form1) напечатайте в некотором месте Star1 и поставите точку, то в соответствующем алфавитном месте будет присутствовать и метод DrawStar (рис. 12).

Замечание

Если Вам в ActiveX-элементе нужна некоторая вспомогательная функция или процедура, и Вы не хотите, чтобы она была вида снаружи, то объявите её просто как Private. В этом случае другие программисты, пользующиеся Вашим готовым ActiveX-элементом, просто её не увидят и вообще о ней никто кроме Вас и знать не будет.

Именно так и добавляются в ActiveX-элемент методы…

Далее

© Ушку ду Кашку

hidden/visible

Hosted by uCoz