|
|
|
новичок
      
участник
Last Login: 13.11.2006 22:22
Сообщ.: 5,
Visits: 43
|
|
| Пишу класс Окружность- координаты центра, радиус. нужно, чтобы окружность не выходила за пределы окна (формы), на котором она рисуется. Как это сделать?
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| У класса Form есть свойство ClientRectangle с размерами области окна в которой можно рисовать. Исходя из нее нетрудно рассчитать координаты центра окружности и ее радиус, так чтобы окружность точно вписалась бы в окно.
|
|
|
|
|
новичок
      
участник
Last Login: 13.11.2006 22:22
Сообщ.: 5,
Visits: 43
|
|
bazile (22.10.2006)
У класса Form есть свойство ClientRectangle с размерами области окна в которой можно рисовать. Исходя из нее нетрудно рассчитать координаты центра окружности и ее радиус, так чтобы окружность точно вписалась бы в окно. Много-много сэнкс Вам за это хорошее свойство! Если Вас не затруднит ответить, то как как бы мне мой activeform к моем классу привязать? Вот на что хватило моих знаний: Public Class CircleInherits FormPrivate mx, my, mRadius As IntegerDim mypen As Pen = New Pen(Color.Tomato, 1)Dim r As RectanglePublic Sub New()MyBase.New()mx = 0 my = 0 mRadius = 0 End SubPublic Property X()GetReturn mxEnd GetSet(ByVal xValue) If xValue > mRadius And xValue + mRadius < r.Width Then ' mx = xValue End If End SetEnd Propertyаналогично свойства Y и Radius Public Sub SetCircle(ByVal xValue As Integer, ByVal yValue As Integer, ByVal rValue As Integer) r = MyBase.ActiveForm.ClientRectangle() X = xValue Y = yValue Radius = rValue End Sub ............... end class
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| В наследовании от класса Form нет никакой нужды. Окружность не является элементом управления форма. Убери наследование от Form и добавь в класс метод с именем Draw. Он должен принимать два аргумента: Rectangle (координаты области внутри которой нужно нарисовать окружность) и Graphics (объект дающий возможность "рисовать" внутри себя). Рисование окружности ты будешь иницировать из события Paint своей формы.
|
|
|
|
|
новичок
      
участник
Last Login: 13.11.2006 22:22
Сообщ.: 5,
Visits: 43
|
|
| Еще раз спасибо Вам, Bazile, за помощь. bazile (23.10.2006) В наследовании от класса Form нет никакой нужды. Окружность не является элементом управления форма. Мдя, у меня получается класс форма с окружностью на ней:) Сама не знаю, чего я себя и людей мучу:развила задание, которое никакой такой оценки расположения окружности на форме или каком-другом объекте Graphics не требовало изначально. "И Остапа понесло" (c), меня то есть, так как "зачет" я получила, но остановиться с моими усовершенствованиями не могу . bazile (23.10.2006) Убери наследование от Form и добавь в класс метод с именем Draw. Он должен принимать два аргумента: Rectangle (координаты области внутри которой нужно нарисовать окружность) и Graphics (объект дающий возможность "рисовать" внутри себя). Я так и делаю(DrawEllipse), но мне нужно же как-то оценивать, что окружность не выходит за пределы содержащего ее объекта Garphics(в моем случае я рисую прямо на форме) уже в конструкторе с аргументами или в свойствах Set. Как связать окружность с ее центром и радиусом с размерами объекта, на котором окружность отображается? bazile (23.10.2006) Рисование окружности ты будешь иницировать из события Paint своей формыПасиб, усвоила...хотя я в приложении кнопочек наставила, которые инициируют изменения координат центра, радиуса и рисование измененной окружности .
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
bonnie_ (23.10.2006) Я так и делаю(DrawEllipse), но мне нужно же как-то оценивать, что окружность не выходит за пределы содержащего ее объекта Garphics(в моем случае я рисую прямо на форме) уже в конструкторе с аргументами или в свойствах Set. Как связать окружность с ее центром и радиусом с размерами объекта, на котором окружность отображается?Ниже уже объяснил - смотри кусок про метод Draw. У него первый аргумент это Rectangle. Ему ты и будешь передавать значение поля ClientRectangle формы на которой идет рисование. Хранить это значение внутри класса не надо.
|
|
|
|
|
новичок
      
участник
Last Login: 13.11.2006 22:22
Сообщ.: 5,
Visits: 43
|
|
так правильно будет? Public Class CirclePrivate mx, my, mRadius As IntegerDim mypen As Pen = New Pen(Color.Tomato, 1)Public Sub New()MyBase.New()mx = 0 my = 0 mRadius = 0 End SubPublic ReadOnly Property X()GetReturn mxEnd GetEnd PropertyPublic ReadOnly Property Y()GetReturn myEnd GetEnd PropertyPublic ReadOnly Property Radius()GetReturn mRadiusEnd GetEnd PropertyPublic Sub SetCircle(ByVal xValue As Integer, ByVal yValue As Integer, ByVal rValue As Integer, ByRef r as Rectangle)If xValue > rValue And xValue + rValue < r.Width Thenmx = xValue End IfIf yValue > rValue And yValue + rValue < r.Height Thenmy = yValue End IfIf mx > rValue And mx + rValue < r.Width And my > rValue And my + rValue < r.Height ThenmRadius = rValue End IfEnd SubPublic Sub Draw(ByRef objGrap As Graphics)objGrap.DrawEllipse(mypen, X - Radius, Y - Radius, 2 * Radius, 2 * Radius) End SubPublic Sub MoveOrdinate(ByVal dy As Integer, ByRef r As Rectangle)SetCircle(X, Y + dy, Radius, r) End SubPublic Sub MoveAbscissa(ByVal dx As Integer, ByRef r As Rectangle)SetCircle(X + dx, Y, Radius, r) End SubPublic Sub GrowUp(ByVal dr As Integer, ByRef r As Rectangle)SetCircle(X, Y, Radius + dr, r) End SubEnd Class
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Если ты не против, я еще немного покритикую твой код :) - Координаты центра окружности лучше хранить в структуре Point. Это логичнее выглядит. - Вызывать базовый конструктор из своего (MyBase.New()) нет необходимости - Функция SetCircle должна работать по принципу "все или ничего", то есть она должна одновременно изменить все три поля или не изменять ни одного.
|
|
| | |