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

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

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

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

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

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

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

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

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

Что-то тяжелое выполняется в момент перетаскивания?
идёт разбор кучи cdr-ов
...
Рейтинг: 0 / 0
Как правильно перерисовать окно?
    #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
Как правильно перерисовать окно?
    #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
Как правильно перерисовать окно?
    #32718555
Serg****
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, все работает.
...
Рейтинг: 0 / 0
Как правильно перерисовать окно?
    #32760059
Barson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вызывать (или обращаться) к форме или к ее контролам из потока, не создавшего ее - категорически запрещено (естественно канонами Win32 программирования)

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

Почитай здесь: http://%5D%7C>]http://]|> http://www.gotdotnet.ru/LearnDotNet/NETFramework/599.aspx
...
Рейтинг: 0 / 0
Как правильно перерисовать окно?
    #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
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно перерисовать окно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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