GDI+ : как нарисовать "скругленный квадрат"

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

LE0
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 08.06.2005 (Ср) 9:55
Откуда: Электросталь

GDI+ : как нарисовать "скругленный квадрат"

Сообщение LE0 » 08.06.2005 (Ср) 10:17

вот был в Vb6 такой объект - Shape
и можно из него было сделать прямоугольники, эллипсы и их производные.

в VB. NET такого объекта нет вообще, а объект Graphics умеет рисовать либо прямоугольники, либо эллипсы.

Нужно хотя бы создать регион такой формы, но для этого, нужно сначала создать регион в виде круга, вопрос - как?
Опять-таки стаднартных функций и методов нет...

а при попытке юзать CreateEllipticRgn из Win32API
а потом медот Region.FromHrgn ничего не работает
Код: Выделить всё
        Dim r As New Region()
        Dim v1 As Integer = CreateEllipticRgn(235, 171, 366, 275)
        Dim ptr As New IntPtr(v1)
        r = r.FromHrgn(ptr)
        G.FillRegion(Brushes.Green, r)

G - объект Graphics

функция CreateEllipticRgn объявлена вот так:

Код: Выделить всё
Public Declare Function CreateEllipticRgn Lib "gdi32" Alias "CreateEllipticRgn" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Integer

в отдельном модуле

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 08.06.2005 (Ср) 10:48

посмотри System.Drawing
там всё что тебе нужно...
А лучше глянь в книжку какуюнить
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

LE0
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 08.06.2005 (Ср) 9:55
Откуда: Электросталь

Сообщение LE0 » 08.06.2005 (Ср) 11:15

Sebas писал(а):посмотри System.Drawing
там всё что тебе нужно...
А лучше глянь в книжку какуюнить


прежде чем спрашивать, я пытаюсь сам решить вопрос, и уж само собой, я это написал, в Drawing нет никаких функций, связанных с эллипсами, кроме FillEllipse, которая мне не нужна... хотя...

а вы меня наталкнули на мысль... что если нарисовать круг, а потом поверх него "дырявый" квадрат, который этот круг обрежет... гыы... :lol:

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 08.06.2005 (Ср) 12:16

Да есть там всё, ещё в 2002 был)))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 08.06.2005 (Ср) 15:21

Привет!
Я например рисовал вот так
Если надо пришлю пример?

Dim GS As System.Drawing.Graphics = GroupBox1.CreateGraphics
Dim Path As New GraphicsPath

Dim x, y As Integer
Dim r As Integer
Dim w, h As Integer
'Координа левого верхнего угла
x = 30
y = 30
'Радиус округляемых элипсов
r = 50
'Длина и Ширина квадрата
w = 300
h = 100
Dim El(3) As Rectangle
El(0) = New Rectangle(x, y, r, r)
El(1) = New Rectangle(x + w, y, r, r)
El(2) = New Rectangle(x, y + h, r, r)
El(3) = New Rectangle(x + w, y + h, r, r)

Path.StartFigure()
Path.AddEllipse(El(0))
Path.AddEllipse(El(1))
Path.AddEllipse(El(2))
Path.AddEllipse(El(3))

Path.AddLine(x + r \ 2, y, x + w + r \ 2, y)
Path.AddLine(x + w + r, y + r \ 2, x + w + r, y + r \ 2 + h)

Path.AddLine(x + w + r \ 2, y + h + r, x + r \ 2, y + h + r)
Path.AddLine(x, y + r \ 2 + h, x, y + r \ 2)

Path.CloseFigure()
Dim rect As New Rectangle(x, y, w + r, h + r)
GS.FillPath(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), Path)
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(0))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(1))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(2))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(3))

LE0
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 08.06.2005 (Ср) 9:55
Откуда: Электросталь

Сообщение LE0 » 08.06.2005 (Ср) 16:20

Спасибо, temur, то, что нужно! Первый раз приходится рисовать, вот и забыл про Path...

Тогда еще такой вопрос: можно ли в Path "залить" всю фигуру целиком, чтобы потом нарисовать ёё одним методом - FillPath ?

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 08.06.2005 (Ср) 21:55

Пожалуйста!
Можно
Нужно установить свойство
Path.FillMode = FillMode.Winding
Тогда заполнять элипсы не надо
тоесть вместо
GS.FillPath(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), Path)
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(0))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(1))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(2))
GS.FillEllipse(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), El(3))

надо написать
Path.FillMode = FillMode.Winding
GS.FillPath(New LinearGradientBrush(rect, Color.Red, Color.Green, LinearGradientMode.Horizontal), Path)

Рад был помочь...

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 08.06.2005 (Ср) 22:36

А лучше еще этот блок

Path.StartFigure()
Path.AddEllipse(El(0))
Path.AddEllipse(El(1))
Path.AddEllipse(El(2))
Path.AddEllipse(El(3))

Path.AddLine(x + r \ 2, y, x + w + r \ 2, y)
Path.AddLine(x + w + r, y + r \ 2, x + w + r, y + r \ 2 + h)

Path.AddLine(x + w + r \ 2, y + h + r, x + r \ 2, y + h + r)
Path.AddLine(x, y + r \ 2 + h, x, y + r \ 2)

Path.CloseFigure()

Заменить на
Path.StartFigure()
Path.AddArc(El(0), 180, 90)
Path.AddLine(x + r \ 2, y, x + w + r \ 2, y)
Path.AddArc(El(1), 270, 90)
Path.AddLine(x + w + r, y + r \ 2, x + w + r, y + r \ 2 + h)
Path.AddArc(El(3), 0, 90)
Path.AddLine(x + w + r \ 2, y + h + r, x + r \ 2, y + h + r)
Path.AddArc(El(2), 90, 90)
Path.AddLine(x, y + r \ 2 + h, x, y + r \ 2)
Path.CloseFigure()
Это понадобится при использовании функции

DrawPath


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList