В этом разделе мы, наконец-то, займёмся рисованием нашей звезды. Для этого в окне кода для нашего 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-элемент методы…
Далее