Хорошо. Итак, я создаю «Приложение Windows Forms» для какого-то парня, использующего C #, и я хочу сделать его интерфейс немного более интересным для него.
Основная форма выглядит как большой циферблат с пользовательскимкнопки расположены на нем.(Я говорю о пользовательских кнопках, поскольку они на самом деле являются простыми пользовательскими элементами управления, которые я создал, которые имеют PictureBox и Метка , которые увеличиваются, когда пользователь указывает на них, а затем уменьшаются, когда мышькурсор перемещается за его пределы. Также имеется свойство Image , которое устанавливает PictureBox 'Изображение и используется в качестве значка так называемой пользовательской кнопки.)
Я использовал два таймера с именами tmrEnlarge и tmrShrink , которые активируются при событиях MouseEnter и MouseLeave соответственно.По сути, это всего лишь пара простых функций для увеличения и уменьшения размера PictureBox , используемого в моем пользовательском элементе управления, и его вид, будто он увеличивается ...
Работает просто отлично, нопроблема в том, что, когда мышь наводит на несколько элементов управления одновременно, анимация замедляет движение дау (что, на мой взгляд, нормально, так как таймеры не лучший способ сделать что-то, как я!), я тоже пытался использовать потоки, нопроблема все еще здесь!: - (
Я хочу знать, каков наилучший способ сделать что-то подобное?
РЕДАКТИРОВАТЬ:
Вот код, который я использовалдля рисования изображения непосредственно на элементе управления без использования PictureBox :
(Это просто быстрая версия, которая оставляет остатков после рисования изображения, что не важнодля меня прямо сейчас)
public partial class DDAnimatingLabel : UserControl
{
public Image Image { get; set; }
public DDAnimatingLabel()
{
InitializeComponent();
}
private void DDAnimatingLabel_MouseEnter(object sender, EventArgs e)
{
tmrEnlarge.Enabled = true;
}
protected override void OnPaint(PaintEventArgs e)
{
if (Image != null)
{
e.Graphics.DrawImage(this.Image, e.ClipRectangle);
}
else
base.OnPaint(e);
}
private void tmrEnlarge_Tick(object sender, EventArgs e)
{
if (Size.Width >= MaximumSize.Width)
{
tmrEnlarge.Enabled = false;
return;
}
Size s = Size;
s.Height += 4;
s.Width += 4;
Size = s;
Point p = Location;
p.X -= 2;
p.Y -= 2;
Location = p;
}
private void tmrShrink_Tick(object sender, EventArgs e)
{
if (tmrEnlarge.Enabled)
return;
if (Size.Width == MinimumSize.Width)
{
tmrShrink.Enabled = false;
return;
}
Size s = Size;
s.Height -= 4;
s.Width -= 4;
Size = s;
Point p = Location;
p.X += 2;
p.Y += 2;
Location = p;
}
private void DDAnimatingLabel_MouseLeave(object sender, EventArgs e)
{
tmrShrink.Enabled = true;
}
}