Пытаюсь плавно менять цвет кнопки при наведении мышки, уходя мышки, нажатия. Идея в вычислении цвета 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(); |
|
Это вообще нормальное решение, или изобретаю велосипед?