Здравствуйте, Hike, Вы писали:
H>Здравствуйте, <Аноним>, Вы писали:
А>>сделал бегущюю строку,взял Panel ну и на нее кидаю label,которые потом двигаю label.Left,двигаю циклически, тоесть когда какой-то label ушел из поля видимости помещая его за тем, за которым он шел,проблема в том, что если добавляю более 20 таких label,строка начинает потреблять 100% CPU, так вот не могу понять из-за чего такое может быть ?!( подскажитеЮ если кто знает, наверняка же кто нибудь писал бегущюю строку !
H>Проблемв в том что ты изменяешь свойство, а свойство — это вызов метода, который делает много работы.
H>Я бы вообще отказался от Label, и просто рисовал бы на контроле.
H>Что тебе мешает создать свой контрол, примерно вот так. Это вариант будет просто летать.
H>H>public class Foo : System.Windows.Forms.Control
H> {
H> protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
H> {
H> e.Graphics.DrawString("foo", ..., x, y);
H> base.OnPaint(e);
H> }
H> }
H>
H>не забудь добавить перерисовку по таймеру (ивалидэйт), чтобы двигались твои бегущие строки.
H>Используй таймер из винформс.
сделал так
public class RunLabel : Control
{
private string Text;
public string LblText
{
get { return this.Text; }
set { this.Text = value; }
}
public RunLabel()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
public int LblLeft
{
get { return this.Left; }
set
{
this.Left = value;
this.Refresh();
}
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
base.OnPaint(e);
}
}
когда вызываю LblLeft доходит до Refresh, только OnPaint не вызывается, подскажите, в чем дело (((