Re[2]: бегущяя строка потребляет 100% CPU!!!(
От: Аноним  
Дата: 19.12.07 16:26
Оценка:
Здравствуйте, 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 не вызывается, подскажите, в чем дело (((
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.