Как придать градиенту форму?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Как придать градиенту форму?

Сообщение Kovu » 06.08.2005 (Сб) 7:46

Конкретно хотелось бы градиент в виде арки , но не знаю как сделать :(
Помогите плиз люди добрые :D :D :D
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.08.2005 (Сб) 8:37

Всё очень просто...
Private Declare Function GradientFill Lib "msimg32.dll" (ByVal hdc As Long, ByRef PTRIVERTEX As PTRIVERTEX, ByVal ulong As Long, ByRef pvoid As Any, ByVal ulong As Long, ByVal ulong As Long) As Long
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 06.08.2005 (Сб) 11:32

Гхм не в виде треугольников(про функцию знал) , а именно в виде арки :D
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.08.2005 (Сб) 11:43

Дык это :)
Любую форму можно достаточно точно нарисовать треугольниками :)

Если не хочешь, тогда копай в сторону GDI+ и её GradientBrush.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 08.08.2005 (Пн) 7:45

Дык это скажи как а то я немного не въезжаю как из треугольников с углами сделать округлый предмет :twisted:
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2005 (Пн) 8:44

Ну представь, что все треугольники имеют общую вершину в одном основании арки, а противоположная сторона каждого треугольника длиной 2 пикселя :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2005 (Пн) 9:18

Ну или так :)

Код: Выделить всё
Option Explicit

Private Declare Function CombineRgn Lib "gdi32.dll" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function SelectClipRgn Lib "gdi32.dll" (ByVal hdc As Long, ByVal hRgn As Long) As Long
Private Declare Function GradientFill Lib "msimg32" (ByVal hdc As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, pMesh As Any, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long

Private Type TRIVERTEX
  x As Long
  y As Long
  Red As Integer
  Green As Integer
  Blue As Integer
  Alpha As Integer
End Type

Private Type GRADIENT_RECT
  UpperLeft As Long
  LowerRight As Long
End Type

Private Const GRADIENT_FILL_RECT_H As Long = &H0
Private Const RGN_COPY As Long = 5
Private Const RGN_OR As Long = 2

Private Function LongToUShort(Unsigned As Long) As Integer
  LongToUShort = CInt(Unsigned - &H10000)
End Function

Private Sub Form_Load()
  Dim vert(0 To 1) As TRIVERTEX
  Dim gRect As GRADIENT_RECT
  Dim r As Long, r2 As Long
 
  Me.ScaleMode = vbPixels
  Me.AutoRedraw = True
 
  r = CreateEllipticRgn(10, 10, 50, 50)
  r2 = CreateRectRgn(10, 30, 50, 100)
  CombineRgn r, r, r2, RGN_OR
  DeleteObject r2
 
  SelectClipRgn Me.hdc, r
  DeleteObject r
 
  'from black
  With vert(0)
    .x = 10
    .y = 10
    .Red = 0
    .Green = 0
    .Blue = 0
    .Alpha = 0
  End With
 
  'to blue
  With vert(1)
    .x = 50
    .y = 100
    .Red = 0
    .Green = 0
    .Blue = LongToUShort(&HFF00&)
    .Alpha = 0
  End With
 
  gRect.UpperLeft = 0
  gRect.LowerRight = 1

  GradientFill Me.hdc, vert(LBound(vert)), 2, gRect, 1, GRADIENT_FILL_RECT_H
 
  SelectClipRgn Me.hdc, 0
 
  Me.Refresh
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

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

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

    TopList