Как заставить окно не перерисовываться при resize?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Как заставить окно не перерисовываться при resize?

Сообщение Особист » 27.09.2009 (Вс) 17:13

Всем привет!
Постараюсь сформулировать, в чём возникла трудность.
Есть форма, на ней объекты привязаны к её размерам. При событии form1_resize они перерисовываются.
Если обновление окна при изменении размеров отключено в винде - мы при изменении его разменров видим предполагаемую границу будущих размеров окна, отпуская кнопку мыши - окно рисуется на месте этой рамки.
А вот если стоит опция перерисовки, то изменения внешнего вида окна мы видим прямо в процессе его растягивания. В висте и 7 эта опция стоит по умолчанию.
Собственно, на форме может быть огромное кол-во подгружаемых объектов, и при каждом его resize проц выполняет дофига действий и циклов, чтобы всё это расставить по своим местам. Поэтому когда пользователь меняет размеры окна, это выглядит некрасиво и тормозит.
Вопрос - можно ли ПРИНУДИТЕЛЬНО заставить программу не перерисовывать всё это, пока пользователь не отпустит кнопку мышки. А для получения представления о будущих размерах рисовать саму рамку, как это было по умолчанию в 95 и 98 винде? Т.е. потянул - появилась рамка - отпустил - на её месте нарисовалось окно.
Заранее благодарю за ответы, если такие будут! ))
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как заставить окно не перерисовываться при resize?

Сообщение iGrok » 27.09.2009 (Вс) 18:56

Чисто теоретичеси - возможно всё. Т.е. да, так сделать можно. Рисовать самому рамку, и самому прописывать логику реагирования на Form_Resize.
Готовых решений для этого нет - т.е. делать придётся самому.

Но чисто практически - нет. Так делать нельзя. Ибо у меня(для примера) эта опция включена, и если твоя программа себя будет вести по-другому, она отправится в корзину. Нефиг своевольничать.

А раз так - то нужно не отключать реакцию на изменение размеров, а оптимизировать код изменения размеров.
Я себе как-то очень слабо представляю, что ж там такого может быть наворочено, чтобы оно сильно тормозило.
label:
cli
jmp label

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как заставить окно не перерисовываться при resize?

Сообщение Debugger » 27.09.2009 (Вс) 19:21

+1 про навороты.
Если контролы рисуются (судя по обработке _Paint), то можно попробовать рисовать всё на буфер один раз, а потом при ресайзе переносить с буфера на форму. Вот.

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Как заставить окно не перерисовываться при resize?

Сообщение Особист » 27.09.2009 (Вс) 20:08

Там Load [object] но дело не в этом.
Оптимизация - да, я согласен, важна. НО! В общем-то оно и так быстро всё рисуется, но возрастает нагрузка на проц. Если не тормозит на PIV, не факт что не будет лагов скажем на P166.
Фигня вот в чём - программа грузит эскизы страниц (тхумбы, т.е. thumbnails, эскизы) из Интернета в реальном времени. Ссылок на такие страницы может быть несколько тысяч. Поэтому эта информация разбивается на страницы.
Размер страницы зависит от размера окна программы, и соответственно вмещает X на Y клеток, usercontrol'ов, в которые грузятся эти thumbnail'ы. Это сделано чтобы не грузить все эти тысячи тхумбов сразу.
И вот когда юзер меняет размер окна - меняется и количество этих клеток на странице. Если он уменьшает размер - это полбеды, т.к. всё уже загружено, удаляем лишние блоки из памяти или делаем их невидимыми до поры до времени. А вот если он увеличивает размеры окна - надо подгружать эти самые тхумбы из инета для новых появившихся контролов. Из-за этого и лаги. Конечно, можно грузить тхумбы с запасом, но это 1) не экономит время пользователя 2) расходует трафик 3) а вдруг их надо будет загрузить очень много, ведь мониторы нынче разные бывают.
Вот если бы по крайней мере дать программе знать, что в настоящий момент пользователь окно растягивает, то она по этому флагу могла бы отложить закачку контента и просто подрисовывать пустые блоки, пока он не отпустит мышь, а после этого события спокойненько загрузить тхумбы в эти контролы...
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как заставить окно не перерисовываться при resize?

Сообщение iGrok » 27.09.2009 (Вс) 22:03

Сабклассить окно на предмет отлова WM_ENTERSIZEMOVE и WM_EXITSIZEMOVE, и действовать собразно - грузить тамбы только по WM_EXITSIZEMOVE.
label:
cli
jmp label

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как заставить окно не перерисовываться при resize?

Сообщение Andrey Fedorov » 27.09.2009 (Вс) 23:57

Можно так попробовать:

Код: Выделить всё
Option Explicit

Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

Dim m_iLWU As Integer

Private Sub Form_Load()
    Me.Timer1.Interval = 50
    Me.Timer1.Enabled = False
End Sub

Private Sub Form_Resize()
    If m_iLWU = 0 Then
        LockWindowUpdate hWnd
        Me.Timer1.Enabled = True
    End If
    m_iLWU = 2
End Sub

Private Sub Timer1_Timer()
    If m_iLWU Then
        m_iLWU = m_iLWU - 1
        Exit Sub
    End If
    Me.Timer1.Enabled = False
    LockWindowUpdate 0
End Sub


Это если по простому...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Как заставить окно не перерисовываться при resize?

Сообщение Особист » 28.09.2009 (Пн) 12:13

Большое спасибо!
Помогло!!!
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 101

    TopList