Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
1

Плавное изменение цвета кнопки TButton при изменении состояния

06.10.2015, 12:45. Показов 1671. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь плавно менять цвет кнопки при наведении мышки, уходя мышки, нажатия. Идея в вычислении цвета FMyColor, который потом используется в закраске клиентской области кнопки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class PACKAGE TMyButton : public TButton
{
 
private:
    TColor FMyColor;
    TColor FMyNormalBackColor;
    TColor FMyActiveBackColor;
    TColor FMyPressedBackColor;
    TColor FMyFocusedBackColor;
    bool FMyMouseDown;
    TTimer *FMyTimer;
    int TickCount;
    TColor StartColor;
    TColor EndColor;
 
protected:
    DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y);
    void __fastcall SetEndColor();
    void __fastcall FMyTimerTimer(TObject *Sender);
};
//---------------------------------------------------------------------------
__fastcall TMyButton::TMyButton(TComponent* Owner)
    : Vcl::Stdctrls::TButton(Owner)
{
    FMyNormalBackColor = clSkyBlue;
    FMyActiveBackColor = clRed;
    FMyPressedBackColor = clYellow;
    FMyFocusedBackColor = clBlue;
    FMyTimer = new TTimer(false);
    FMyTimer->Interval = 100;
    FMyTimer->OnTimer = FMyTimerTimer;
    TickCount = 30;
    EndColor = FMyNormalBackColor;
    FMyColor = FMyNormalBackColor;
}
//---------------------------------------------------------------------------
void __fastcall TMyButton::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
    StartColor = EndColor;
    FMyMouseDown = true;
    SetEndColor();
    FMyTimer->Enabled = true;
    TButton::MouseDown(Button,Shift,X,Y);
}
//---------------------------------------------------------------------------
void __fastcall TMyButton::SetEndColor()
{
    if (FMyMouseOn)
    {
        if (FMyMouseDown)
        {
            EndColor = FMyPressedBackColor;
        }
        else
        {
            EndColor = FMyActiveBackColor;
        }
    }
    else
    {
        if (Focused())
        {
            EndColor = FMyFocusedBackColor;
        }
        else
        {
            EndColor = FMyNormalBackColor;
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TMyButton::FMyTimerTimer(TObject *Sender)
{
    for (int i=0; i<=TickCount; i++)
    {
        Byte R1 = GetRValue(StartColor);
        Byte G1 = GetGValue(StartColor);
        Byte B1 = GetBValue(StartColor);
        Byte R2 = GetRValue(EndColor);
        Byte G2 = GetGValue(EndColor);
        Byte B2 = GetBValue(EndColor);
        Byte R = R1 - i*(R1-R2)/TickCount;
        Byte G = G1 - i*(G1-G2)/TickCount;
        Byte B = G1 - i*(B1-B2)/TickCount;
        FMyColor = RGB(R,G,B);
    }
    FMyTimer->Enabled = false;
}
Код компилируется, но не работает как задумано. Подскажите почему.

Добавлено через 7 минут
Вроде бы функция FMyTimerTimer неправильная. Там не должно быть цикла. Добавил приватную переменную Tick = 0 и изменил функцию, но все равно не работает как хочется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TMyButton::FMyTimerTimer(TObject *Sender)
{
    Byte R1 = GetRValue(StartColor);
    Byte G1 = GetGValue(StartColor);
    Byte B1 = GetBValue(StartColor);
    Byte R2 = GetRValue(EndColor);
    Byte G2 = GetGValue(EndColor);
    Byte B2 = GetBValue(EndColor);
    Byte R = R1 - Tick*(R1-R2)/TickCount;
    Byte G = G1 - Tick*(G1-G2)/TickCount;
    Byte B = B1 - Tick*(B1-B2)/TickCount;
    FMyColor = RGB(R,G,B);
    Tick++;
    if (Tick == TickCount)
    {
        Tick = 0;
        FMyTimer->Enabled = false;
    }
}
Добавлено через 19 минут
Добавил в FMyTimerTimer функцию Repaint() - вроде бы работает.
C++
1
2
FMyColor = RGB(R,G,B);
Repaint();
Это вообще нормальное решение, или изобретаю велосипед?

Добавлено через 56 секунд
Добавил в FMyTimerTimer функцию Repaint() - вроде бы работает.
C++
1
2
FMyColor = RGB(R,G,B);
Repaint();
Это вообще нормальное решение, или изобретаю велосипед?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2015, 12:45
Ответы с готовыми решениями:

Плавное изменение цвета PictureBox при изменении параметров TrackBar
На форме есть два PictureBox : синий и красный. Как при движении TrackBar плавно делать светлее...

Плавное изменение цвета кнопки
как сделать чтобы при наведении на кнопку она плавно меняла цвет и прозрачность?

Плавное изменение размера шрифта при изменении позиции курсора
&lt;a href=&quot;#&quot;&gt;Read More&lt;/a&gt; body { padding: 50px; } a { position: relative; padding:...

Компонент TButton: Изменение размера шрифта кнопки при нажатии
Необходимо разработать компоненты, основанные на модификации стандартных компонентов, в...

0
06.10.2015, 12:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2015, 12:45
Помогаю со студенческими работами здесь

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

При добавлении компонента к примеру кнопки. В коде Button1: TButton; выдает ошибку что TButton не известно.
Прошу у вас помощи. Rad Studio XE 3 выдает глупую ошибку. При добавлении компонента к примеру...

Плавное изменение цвета фона по времени в рандомные цвета
В общем, есть изображение (фон), мне необходимо, чтобы оно плавно окрашивалось в различные цвета...

BitBtn - изменение состояния кнопки при нажатии
подскажите. как сделать, что б при нажатии BitBtn кнопка меняла вид на нажатую, при повторном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru