Здравствуйте! Пишу сейчас свой контрол Ticker (бегущая строка) под dotNet CF. Есть небольшой вопрос. Вот приблизительный код контрола (не законченная версия):
Код | public partial class Ticker : UserControl { String textToView = String.Empty; int delay = 200;
public UserControl1() { InitializeComponent(); }
public String TextToView { set { textToView = value; } get { return textToView; } }
public int Delay { set { delay = value; } get { return delay; } }
protected override void OnPaint(PaintEventArgs e) { int x, y; x = 0; y = 2; Graphics g = e.Graphics; if (!textToView.Equals(String.Empty)) { for (int i = 0; i < 20; i++) { g.Clear(this.BackColor); g.DrawString(textToView, this.Font, new SolidBrush(this.ForeColor), x, y); x++; Thread.Sleep(delay); } } } }
|
Когда юзаю контрол в приложениях происходит следующее: сам тикер рисует себя корректно, но при этом блокируется контейнер (форма, на которой лежит тикер). Когда внутри OnPaint класса Ticker цикл отрисовки проходит все итерации - управление нормально передается контейнеру (форме).
Контрол лепил вот так:
Код | public partial class Form1 : Form { delegate void initTicker(); Ticker ticker; public Form1() { InitializeComponent(); Thread t = new Thread(new ThreadStart(initializeTick)); t.Start(); t.Join(); }
private void initializeTick() { initTicker tickDelegate = new initTicker(addTick); this.Invoke(tickDelegate); }
private void addTick() { ticker = new Titcker(); ticker.TextToView = "this is ticker text"; this.Controls.Add(ticker); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("bla bla bla!"); } }
|
Хотелось бы узнать как заставить их рисовать себя асинхронно. Заранее благодарен |