Покраска текста

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

Покраска текста

Сообщение Kovu » 16.09.2006 (Сб) 16:47

Написал я небольшую программку для покраски градиентом цвета в ббкоде, но иногда некоторые буквы почему то оказываются как бы вне градиента по цвету. Не могли бы вы помочь найти ошибку? :roll:
Вложения
TextGradientBBcode.rar
(1.65 Кб) Скачиваний: 49
Если всё делать своими ручками, они скоро отвалятся !

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 17.09.2006 (Вс) 16:16

Правильная процедура:

Код: Выделить всё
Private Sub cmdStrt_Click()
Dim R(1) As Long, G(1) As Long, B(1) As Long, deltacol(2) As Long, i As Long, tempstr As String
If Len(txt1.Text) <= 1 Then Exit Sub
    R(0) = &HFF& And clor(0)
    G(0) = (&HFF00& And clor(0)) \ 256
    B(0) = (&HFF0000 And clor(0)) \ 65536
    R(1) = &HFF& And clor(1)
    G(1) = (&HFF00& And clor(1)) \ 256
    B(1) = (&HFF0000 And clor(1)) \ 65536
    deltacol(0) = (R(1) - R(0)) \ Len(txt1.Text)
    deltacol(1) = (G(1) - G(0)) \ Len(txt1.Text)
    deltacol(2) = (B(1) - B(0)) \ Len(txt1.Text)
    For i = 0 To Len(txt1.Text) - 1
        tempstr = tempstr & starttag & Format$(Hex(R(0) + i * deltacol(0)), "00") & Format$(Hex(G(0) + i * deltacol(1)), "00") & Format$(Hex(B(0) + i * deltacol(2)), "00") + "]" & Mid$(txt1.Text, i + 1, 1) & endtag
    Next i
    txt2.Text = tempstr
End Sub


Т.е. в цикле формировать строку не плюсами, а &
Salus populi suprema lex

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.09.2006 (Вс) 16:27

Т.е. в цикле формировать строку не плюсами, а &
А в этом случае есть разница?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 17.09.2006 (Вс) 19:44

ANDLL писал(а):
Т.е. в цикле формировать строку не плюсами, а &
А в этом случае есть разница?


Как показывает тестирование программы - есть...
Salus populi suprema lex

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

Сообщение Kovu » 17.09.2006 (Вс) 22:14

dr.MIG
Спасибо конечно, не помогло :( Баг с градиентными переходами есть всё равно. Подправил пока саму процедуру на такую:
Код: Выделить всё
Private Sub cmdStrt_Click()
Dim R(1) As Long, G(1) As Long, B(1) As Long, deltacol(2) As Long, i As Long, tempstr As String, dtemp(2) As String
If Len(txt1.Text) <= 1 Then Exit Sub
    R(0) = &HFF& And clor(0)
    G(0) = (&HFF00& And clor(0)) \ 256
    B(0) = (&HFF0000 And clor(0)) \ 65536
    R(1) = &HFF& And clor(1)
    G(1) = (&HFF00& And clor(1)) \ 256
    B(1) = (&HFF0000 And clor(1)) \ 65536
    deltacol(0) = (R(1) - R(0)) \ (Len(txt1.Text) - 1)
    deltacol(1) = (G(1) - G(0)) \ (Len(txt1.Text) - 1)
    deltacol(2) = (B(1) - B(0)) \ (Len(txt1.Text) - 1)
    For i = 0 To Len(txt1.Text) - 1
        'tempstr = tempstr + starttag + Format$(Hex(R(0) + i * deltacol(0)), "00") + Format$(Hex(G(0) + i * deltacol(1)), "00") + Format$(Hex(B(0) + i * deltacol(2)), "00") + "]" + Mid$(txt1.Text, i + 1, 1) + endtag
        dtemp(0) = Format$(Hex(R(0) + i * deltacol(0)), "00")
        If Len(dtemp(0)) < 2 Then dtemp(0) = "0" + dtemp(0)
        dtemp(1) = Format$(Hex(G(0) + i * deltacol(1)), "00")
        If Len(dtemp(1)) < 2 Then dtemp(1) = "0" + dtemp(1)
        dtemp(2) = Format$(Hex(B(0) + i * deltacol(2)), "00")
        If Len(dtemp(2)) < 2 Then dtemp(2) = "0" + dtemp(2)
        tempstr = tempstr & starttag & dtemp(0) & dtemp(1) & dtemp(2) & "]" & Mid$(txt1.Text, i + 1, 1) & endtag
    Next i
    txt2.Text = tempstr
End Sub
Если всё делать своими ручками, они скоро отвалятся !

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.09.2006 (Вс) 22:23

dr.MIG писал(а):Как показывает тестирование программы - есть...
Видимо, все таки нет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Хакер » 18.09.2006 (Пн) 0:38

Работает или нет. Сейчас проверим на форуме!
Вроде бы работает...



Вот новый код формы:
Код: Выделить всё
Const starttag = "[color=#"
Const endtag = "[/color]"

Private Sub cmdStrt_Click()
    txt2.Text = ""
    For i = 1 To Len(txt1.Text)
        txt2 = txt2 + starttag + blendColor(picstrt.BackColor, picend.BackColor, i / Len(txt1.Text)) + "]" + Mid$(txt1.Text, i, 1) + endtag
    Next i
End Sub

Private Sub Form_Load()
picstrt.BackColor = vbBlack
picend.BackColor = vbBlack
txt1.Text = ""
txt2.Text = ""
End Sub

Private Sub picend_Click()
CD1.ShowColor
picend.BackColor = CD1.Color
clor(1) = CD1.Color
End Sub

Private Sub picstrt_Click()
CD1.ShowColor
picstrt.BackColor = CD1.Color
clor(0) = CD1.Color
End Sub

Public Function blendColor(cFrom As Long, cTo As Long, sProgress As Single) As String
Dim sR As Byte, sG As Byte, sB As Byte
Dim dr As Byte, dg As Byte, db As Byte

sR = cFrom And CByte(255)
sG = (cFrom And 65535) \ 256
sB = (cFrom And (CLng(256) * 256 * 256 - 1)) \ 256 \ 256

dr = cTo And CByte(255)
dg = (cTo And 65535) \ 256
db = (cTo And (CLng(256) * 256 * 256 - 1)) \ 256 \ 256

blendColor = hexform( _
sR - ((CInt(sR) - CInt(dr)) * sProgress), _
sG - ((CInt(sG) - CInt(dg)) * sProgress), _
sB - ((CInt(sB) - CInt(db)) * sProgress))


End Function

Public Function hexform(ByVal iRed As Integer, ByVal iGreen As Integer, ByVal iBlue As Integer) As String
hexform = Right("00" + Hex(iRed), 2) + _
          Right("00" + Hex(iGreen), 2) + _
          Right("00" + Hex(iBlue), 2)
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Kovu » 18.09.2006 (Пн) 8:09

Хм, вот с этими цветами раньше были глюки
Спасибо огромное, Хакер :)
Если всё делать своими ручками, они скоро отвалятся !

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.09.2006 (Пн) 8:42

Помнится, несколько месяцев назад мы с d3drm еще и вот так развлекались...
Код: Выделить всё
Const startsize = "[size="
Const endsize = "[/size]"

'...

        txt2 = txt2 + startsize + CStr(CInt(8 + Abs(4 * Sin(3.14 / 2 + i / 5)))) + "]" + starttag + blendColor(picstrt.BackColor, picend.BackColor, i / Len(txt1.Text)) + "]" + Mid$(txt1.Text, i, 1) + endtag + endsize

'...

:)


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

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

Сейчас этот форум просматривают: Mail.ru [бот], SemrushBot и гости: 117

    TopList