среда, 31 октября 2012 г.

Плавная смена цвета элементов WinForms

Вот прошло совсем не много времени, и новая публикация. Сегодня я покажу как сделать интересный эффект смены цвета.
Демонстрацию буду проводить на следующем примере: Заменить текст в элементе label по клику по кнопке, но смена текста должна происходить плавно. Так как лучше один раз показать, чем 100 раз рассказать, то тут вы можете скачать ДЕМО.
Для начала создадим проект WinForms и добавим на форму: Label и Button.

Вот код формы:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        dR = label1.BackColor.R - label1.ForeColor.R;
        dG = label1.BackColor.G - label1.ForeColor.G;
        dB = label1.BackColor.B - label1.ForeColor.B;
        sign = 1;
        Timer timer = new Timer();
        timer.Interval = 100;
        timer.Tick += timer_Tick;
        timer.Start();
    }
    int dR, dG, dB, sign;
    void timer_Tick(object sender, EventArgs e)
    {
        if (Math.Abs(label1.ForeColor.R - label1.BackColor.R) < Math.Abs(dR / 10))
        {
            sign *= -1;
            label1.Text = "Новый текст";
        }            
        label1.ForeColor = Color.FromArgb(255, label1.ForeColor.R + sign * dR / 10, label1.ForeColor.G + sign * dG / 10, label1.ForeColor.B + sign * dB / 10);
        if (label1.BackColor.R == label1.ForeColor.R + dR)
        {
            ((Timer)sender).Stop();
        }
    }
}
При запуске приложения, в label один текст. После нажатия на кнопку, он блекнет, потом проявляется новый текст. Вся анимация занимает 2 секунды... Основная идея в том, что изменения свойств должны идти не в цикле и за доли секунды, а через таймер и хоть какое то время, которое будет различать пользователь.

Этот же прием можно использовать для любого элемента интерфейса WinForms, не ограничивайте себя, пробуйте.

P.S. Если хотите писать красивости в пользовательском интерфейсе, переходите на XAML, там все это намного проще...

Комментариев нет:

Отправить комментарий