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

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

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

Студворк — интернет-сервис помощи студентам
Пытаюсь плавно менять цвет кнопки при наведении мышки, уходя мышки, нажатия. Идея в вычислении цвета 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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: 10px; font-weight:...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.10.2015, 12:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru