Градиентная заливка

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

Градиентная заливка

Сообщение DiSe » 23.08.2003 (Сб) 13:27

Обычную заливку легко сделать с помощью FloodFill. Но как сделать градиентную заливку определённой ограниченной области, при этом разные стили градиентной заливки?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.08.2003 (Сб) 13:33

Не знаю, как в VB, но можно в Photoshop'e сделать заливку, а потом или в Image её засунуть, или через VBScanner ([url=vbscanner.narod.ru]VBScanner.narod.ru[/url]) пропустить. :wink:
Нет меня больше

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

Сообщение GSerg » 23.08.2003 (Сб) 14:04

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

DiSe
Обычный пользователь
Обычный пользователь
 
Сообщения: 97
Зарегистрирован: 30.06.2003 (Пн) 19:11

Сообщение DiSe » 23.08.2003 (Сб) 17:16

To A.A.Z. - Мне нужно сделать это в программном коде.
To GSerg - У меня нет MSDN. Поэтому, если знаешь где скачать MSDN и если не трудно, то подскажи.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 23.08.2003 (Сб) 19:21

DiSe писал(а):To GSerg - У меня нет MSDN. Поэтому, если знаешь где скачать MSDN и если не трудно, то подскажи.


У всех есть :D http://msdn.microsoft.com

mark+
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 156
Зарегистрирован: 03.07.2003 (Чт) 0:04
Откуда: Kurgan

Сообщение mark+ » 23.08.2003 (Сб) 22:11

Могу подсказать ocx'ы из моей коллекции. Есть один мужик - Alvaro Redonto. Так что сгоняй на www.sevillaonline.com/ActiveX
:? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :? :?

Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Сообщение Sanya Z » 23.08.2003 (Сб) 23:25

А код который в "Советах для VB" разве не подходит?

Код: Выделить всё
Sub Dither(vForm As Form)
Dim intLoop As Integer vForm.DrawStyle =
vbInsideSolid vForm.DrawMode = vbCopyPen vForm.ScaleMode =
vbPixels vForm.DrawWidth = 2 vForm.ScaleHeight = 256 For intLoop
= 0 To 255 vForm.Line (0, intLoop)-(Screen.Width, intLoop - 1), _
RGB(0, 0, 255 -intLoop), B Next intLoop
End Sub


А далее используешь...

Код: Выделить всё
Dither ME


Можно менять цвета варьируя значения. Есть другие варианты, если найду то сюда кину. :!:
И пусть в моих поступках не было логики...

DiSe
Обычный пользователь
Обычный пользователь
 
Сообщения: 97
Зарегистрирован: 30.06.2003 (Пн) 19:11

Сообщение DiSe » 25.08.2003 (Пн) 7:57

To Sanya Z - Этот код годится только для прямоугольной области. А мне нужно - для произвольной.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 21.04.2008 (Пн) 22:34

Подскажите, пожалуйста, а как в этой палитре
Код: Выделить всё
Sub Dither(vForm As Form)
Dim intLoop As Integer
vForm.DrawStyle = vbInsideSolid
vForm.DrawMode = vbCopyPen
vForm.ScaleMode =
vbPixels vForm.DrawWidth = 2 vForm.ScaleHeight = 256
For intLoop = 0 To 255
vForm.Line (0, intLoop)-(Screen.Width, intLoop - 1), RGB(0, 0, 255 -intLoop), B
Next intLoop
End Sub
сделать переход с темно-синего на светло-синий?
Константин

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Градиентная заливка

Сообщение BION » 22.04.2008 (Вт) 0:41

DiSe писал(а):Обычную заливку легко сделать с помощью FloodFill. Но как сделать градиентную заливку определённой ограниченной области, при этом разные стили градиентной заливки?


Вот... там функция
Код: Выделить всё

Fade(obj As Object, StartColour As Long, EndColor As Long, TopToBottom As Boolean)
' Object - объект кот. закрашиваем
' StartColour - нач. цвет
' EndColor - кон. цвет
' TopToBottom - true: вертикально, false: горизонтально


'пр:
Fade Picture1, vbBlack, vbWhite, True
Вложения
modGradientTitle.rar
Градиентит
(2.36 Кб) Скачиваний: 64

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.04.2008 (Вт) 9:55

kminas
Например так:
Код: Выделить всё
vForm.Line (0, intLoop)-(Screen.Width, intLoop - 1), RGB(128 - intLoop \ 2, 128 - intLoop \ 2, 255 - intLoop \ 2), B

BION
DiSe это писал 5 лет назад. :)

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 18:13

Спасибо, Mikle Еще бы чуток. Я хочу, чтобы, наоборот тёмно-синяя полоса была сверху, как бы продолжая цвет Title, а книзу посветлее. Пробовал и так и эдак переставлять. Чет не въезжаю, где оттенки зарыты?
Константин

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.04.2008 (Вт) 18:34

Код: Выделить всё
Line (0, intLoop)-(Screen.Width, intLoop - 1), RGB(intLoop \ 2, intLoop \ 2, 127 + intLoop \ 2), B

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 19:22

Спасибо! Mikle. То, что нужно. А где ты берешь эти коды? Ищу и в интернет и по книгам, но только такие &HE0E0E0 или такие 14737632 нахожу.
И почему-то на одном компе, при отладке все отображается нормально, а на другом при отладке форма не окрашенная, а после компиляции палитра рисуется, причем при пошаговой отладке по F8 всё красится?
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 19:24

А где ты берешь эти коды?

Из головы он их берёт :roll:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 19:45

Я тоже из головы брал и 255 - intLoop ставил и 0 + intLoop сочинил и пробовал в разных вариантах и разные другие чилса писал, но до 127(128) не дошел. Кроме того, неужели ж он сам придумал обратный слэш и цифру?
Кстати, а что такое В? У меня и без нее пашет. правда последние коды не проверял?
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 19:49

Кроме того, неужели ж он сам придумал обратный слэш и цифру?

Противно становится от таких "неужели".

Ужели. Обратный слэш - оператор целочисленного деления. Он просто знает об этом, и все знают. Поскольку его здесь более целесообразно применять, он и поставил обратный слэш.

B - от слова Border (рамка). Означает: рисовать рамку вокруг воображаемой линии (но не рисовать саму линию). BF означает Border Filled - рисовать заполненную цветом рамку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 20:05

Спасибо за рамки, но все равно где-то я раньше встречал описание оттенков. О, действительно, и прямой слэш тоже работает!
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 20:11

Не надо встречать описание оттенков, надо всего лишь знать, как устроена система RGB. Так для любого оттенка сможешь сам влёгкую составить код типа &HDEAD00.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 20:28

Нет, описания мне не нужно, я не могу найти тенденцию, где какой цвет, в принципе, понятно, а, как идут цвета от темного (или насыщенного) к бледному?
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 20:32

как идут цвета от темного (или насыщенного) к бледному?

Он полностью, скажем, синего (vbBlue, RGB(0,0,255)) к бледно-бледно-синему увеличивается значение R- и G- составляющих.

Для остальных цветов аналогично.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 20:37

А, так еще надо добавлять vbBlue? Если так, то другое дело.
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 20:39

Чего??
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 20:50

Ну, понятно, говорю, буду пробовать, спасибо!
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 21:28

Что ты будешь пробовать? Добавлять vbBlue?

Не надо ничего добавлять. Что вообще значит "Добавлять vbBlue" ??
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 22.04.2008 (Вт) 22:52

Ладно, ничего не буду добавлять.
Константин

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 23.04.2008 (Ср) 9:55

Последние 10 ответов - жесть. Ну просто жесть. kminas, изучи... хотя нет. Просто нет слов.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 23.04.2008 (Ср) 13:33

kminas
Вообще тот фрагмент кода написан, мягко говоря, неудачно. Я бы делал так:
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
Dim n As Long
Dim Col1 As Long, Col2 As Long, Col As Long
  Show
  Col1 = RGB(128, 128, 255)
  Col2 = RGB(0, 160, 128)
  ScaleMode = vbPixels
  For n = ScaleTop To ScaleTop + ScaleHeight - 1
    Col = ColLerp(Col1, Col2, (n - ScaleTop) / (ScaleHeight - ScaleTop))
    Line (ScaleLeft, n)-(ScaleLeft + ScaleWidth - 1, n), Col
  Next n
End Sub

Private Function ColLerp(ByVal c1 As Long, ByVal c2 As Long, ByVal k As Single) As Long
Dim r As Integer, g As Integer, b As Integer
  r = (c1 And 255&) * k + (c2 And 255&) * (1 - k)
  g = ((c1 \ 256&) And 255&) * k + ((c2 \ 256&) And 255&) * (1 - k)
  b = ((c1 \ 65536) And 255&) * k + ((c2 \ 65536) And 255&) * (1 - k)
  ColLerp = RGB(r, g, b)
End Function

Col1, Col2 - два любых цвета.
ColLerp - линейная интерполяция, описана в любом учебнике математики.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 23.04.2008 (Ср) 20:34

Mikle Спасибо! Тут вижу действительно и мне, неучу, понятно. Задаешь 2 цвета и пляши от них, а посередине и будет то, что по интерполяции получилось. Конечно, что такое линейная интерполяция
или, обычно, просто интерполяция знаю и по работе, да и в жизни. Никакого учебника не нужно.
P.s. А фрагмент тот переписывают из сайта в сайт. Уж больше десятка видел.
Константин


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

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

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

    TopList