Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно перерисовать окно? / 8 сообщений из 8, страница 1 из 1
29.09.2004, 15:34
    #32716963
Serg****
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Из окна 1 открывается модальное окно, при его перетаскивании на окне 1 остаются белые следы. Кто знает как от этого избавиться?

На окне 2 имеется Прогресс Бар. Вся фишка в том что получается либо правильно отображать Прогресс, либо правильно перетаскивать.

Может я что-то упустил, подскажите, кто знает.
...
Рейтинг: 0 / 0
29.09.2004, 16:51
    #32717212
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Привет,

Serg****Из окна 1 открывается модальное окно, при его перетаскивании на окне 1 остаются белые следы. Кто знает как от этого избавиться?

На окне 2 имеется Прогресс Бар. Вся фишка в том что получается либо правильно отображать Прогресс, либо правильно перетаскивать.

Может я что-то упустил, подскажите, кто знает.

Прогресс бар самодельный?
OnPaint у окон не переписан? OnPaint базового класса вызывается?
SetStyle пользовался случайно?
Что-то тяжелое выполняется в момент перетаскивания?

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
29.09.2004, 17:11
    #32717288
Serg****
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Прогресс бар самодельный?
нет
OnPaint у окон не переписан?
нет
OnPaint базового класса вызывается?
если вызывать Refresh у базового класса в отдельеном треде, то всё ОК

SetStyle пользовался случайно?
На окне 1 - да, на окне 2 - нет

Что-то тяжелое выполняется в момент перетаскивания?
идёт разбор кучи cdr-ов
...
Рейтинг: 0 / 0
29.09.2004, 17:40
    #32717402
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Serg****

1. SetStyle пользовался случайно?
На окне 1 - да, на окне 2 - нет

2. Что-то тяжелое выполняется в момент перетаскивания?
идёт разбор кучи cdr-ов

OnPaintBackground, вероятно, тоже не переписывался?

По поводу 1:

Какой из стилей и в какое состояние установлен у окна 1?
AllPaintingInWmPaint, UserPaint, Opaque, DoubleBuffer?

По поводу 2:

Желательно что бы обработка данных производилась в отдельном потоке и сообщала о выполнении очередной части задания через события.

Вероятно так же надо время от времени выделять системе процессорные ресурсы для перерисовки объектов. (Особенно, если у потока обработчика изменен приоритет)

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
29.09.2004, 18:52
    #32717615
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Serg****
Что-то тяжелое выполняется в момент перетаскивания?
идёт разбор кучи cdr-ов

Пример, как это сделать правильно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
     // .... здесь не показан код создания и инициализации окна 
     // на окне две кнопки (WorkStart, WorkAbort) и прогресс - бар 

    public delegate void HardWorkEventDelegate(int val);

    class HardWork
    {
      private int progressMax;

      public event HardWorkEventDelegate OnEvent;

      public HardWork(int progressMax)
      {
        this.progressMax = progressMax;
      }

      public void StartProcess()
      {
        for(int i = 0; i < progressMax; i++)
        {
           // Выполняем кусок нашей тяжелой работы 

          DoWork();

           // и изменяем состояние прогресс-бара 
          if(OnEvent != null)
            OnEvent(i);
        }
      }
    }

    HardWork work;
    System.Threading.Thread thread;

    private void WorkStart_Click(object sender, System.EventArgs e)
    {
      WorkStart.Enabled = false;
      WorkAbort.Enabled = true;
      work = new HardWork(this.progressBar.Maximum);
      work.OnEvent += new HardWorkEventDelegate(work_OnEvent);

      thread = new System.Threading.Thread(new System.Threading.ThreadStart(work.StartProcess));

      thread.Start();
    }

    private void WorkAbort_Click(object sender, System.EventArgs e)
    {
      if(thread == null)
        return;
      thread.Abort();
      thread = null;
      work.OnEvent -= new HardWorkEventDelegate(work_OnEvent);
      work = null;
      WorkAbort.Enabled = false;
      WorkStart.Enabled = true;
    }

    private void work_OnEvent(int val)
    {
      this.progressBar.Value = val;
    }
  }


--
WBR, Roman S. Golubin
ICQ UIN: 63253392
...
Рейтинг: 0 / 0
30.09.2004, 13:03
    #32718555
Serg****
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Спасибо, все работает.
...
Рейтинг: 0 / 0
28.10.2004, 18:51
    #32760059
Barson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Вызывать (или обращаться) к форме или к ее контролам из потока, не создавшего ее - категорически запрещено (естественно канонами Win32 программирования)

Хотя, ваше право.

Почитай здесь: http://%5D%7C>]http://]|> http://www.gotdotnet.ru/LearnDotNet/NETFramework/599.aspx
...
Рейтинг: 0 / 0
28.10.2004, 20:52
    #32760178
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно перерисовать окно?
Хорошо. Пусть будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    private void work_OnEvent(int val)
    {
      if (InvokeRequired)
        Invoke(new HardWorkEventDelegate(work_OnEvent), new object[]{val});
      else
        this.progressBar.Value = val;
    }

И еще не прохо добавить остановку потока перед закрытием формы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  protected override void Dispose( bool disposing )
  {
    if( disposing )
    {
      if (components != null) 
      {
        components.Dispose();
      }
      WorkAbort_Click(this, new EventArgs());
    }
    base.Dispose( disposing );
  }

--
WBR,
Roman S. Golubin
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно перерисовать окно? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]