Проблема с Resize-ом окна

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

Проблема с Resize-ом окна

Сообщение |kerish| » 23.04.2010 (Пт) 14:19

Здравствуйте! Я столкнулся с небольшой проблемой, но незнаю как её обойти, надеюсь вы подскажете.

Мне нужно чтобы окно ресайзилось, но не становилось менее определенного размера.

Проблема в том, что если просто поставить заглушку в событии Resize, то в Висте или Семёрке на долю секунды происходит некрасивое мерцание.
Типа как форма всё равно становится меньше, но моментально становится минимально доступного размера.

В толку не возьму, как сделать это по-нормальному :(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 23.04.2010 (Пт) 14:21

Установить с помощью специальной WinAPI-фукнкции минимальный и максимальный размеры окна. Ищи эту функцию сам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 23.04.2010 (Пт) 15:08

Код: Выделить всё
Option Explicit
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MINMAXINFO
    ptReserved As POINTAPI
    ptMaxSize As POINTAPI
    ptMaxPosition As POINTAPI
    ptMinTrackSize As POINTAPI
    ptMaxTrackSize As POINTAPI
End Type

Private Const WM_GETMINMAXINFO = &H24
Private Const GWL_WNDPROC = (-4)

Private Declare Sub GetMem4 Lib "msvbvm60.dll" (pSrc As Any, pDst As Any)
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim PrevProc As Long

' в Form_Load
Public Sub HookWindow(ByVal hwnd As Long)
    PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

' в Form_Unload
Public Sub UnHookWindow(ByVal hwnd As Long)
    Call SetWindowLong(hwnd, GWL_WNDPROC, PrevProc)
End Sub

Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_GETMINMAXINFO Then
        Dim Info As MINMAXINFO
            Call SetMinSize(Info, lParam)
        WindowProc = 1
    Else
        WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
    End If
End Function

Private Sub SetMinSize(Info As MINMAXINFO, ByVal lParam As Long)
    Call GetMem4(lParam, ByVal VarPtr(lParam) - 4)
    With Info
        .ptMinTrackSize.x = <твоё значение>
        .ptMinTrackSize.y = <твоё значение>
    End With
End Sub
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 23.04.2010 (Пт) 15:32

Нет, это плохой вариант для данного случая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 23.04.2010 (Пт) 15:56

Чем?
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 23.04.2010 (Пт) 16:59

Что, совсем никаких соображений у самого нет, чем?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 23.04.2010 (Пт) 21:48

Ну почему же.
Суть вопроса была в попытке услышать твое мнение, как эксперта, а не моё, как новичка.
Научились ли Вы радоваться трудностям?

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Проблема с Resize-ом окна

Сообщение Денис » 23.04.2010 (Пт) 21:59

Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 23.04.2010 (Пт) 23:11

Мнение как эскперта: сабклассинг — жутко противная вещь, которая таит приятные сюрпризы (в виде крахов) при отладке и медленную работу.

Какая глупость использовать сабклассинг для такой задачи, когда достаточно один раз вызвать функцию SetWindowPlacement, установив мин./макс. габариты окна.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 24.04.2010 (Сб) 0:00

Не дошло.
Можно объяснить "на пальцах"?
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 24.04.2010 (Сб) 0:09

Что не дошло? Что тут вообще могло не дойти?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Проблема с Resize-ом окна

Сообщение Денис » 24.04.2010 (Сб) 0:16

hclubmk писал(а):Не дошло.
Можно объяснить "на пальцах"?


Можно. В Form_Load() вызывается эта функция и всё.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 24.04.2010 (Сб) 7:34

Не дошло:
1 где здесь минимально/максимально допустимые габариты.
2 почему MSDN приводит пример с хуком.
Научились ли Вы радоваться трудностям?

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Re: Проблема с Resize-ом окна

Сообщение |kerish| » 24.04.2010 (Сб) 14:10

Спасибо за помощь.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Проблема с Resize-ом окна

Сообщение Денис » 01.05.2010 (Сб) 22:04

Вот кстати, ап, в связи с.
Я долго смотрел на этот топик, чувствуя, что хочу что-то сказать, но не помню, что. И вот, пока вспомнил: а все-таки в паскалеподобных языках с этим проще, задаешь в свойствах объекта SizeConstraints и нет проблем, компилятор сам выбирает способ, как провести задание минимальных и максимальных размеров, будь то форма или контрол.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Проблема с Resize-ом окна

Сообщение VBTerminator » 10.05.2010 (Пн) 17:57

Заранее извиняюсь, если это некрофилия.

Не понимаю, к чему так? Ведь всё очень просто реализуется стандартными возможностями VB:
Код: Выделить всё
Const MinWidth As Long = 100  'Минимальная ширина окна
Const MinHeight As Long = 100  'Минимальная высота окна

Private Sub Form_Resize()

   If Width < MinWidth Then Width = MinWidth
   if Height < MinHeight  Then Height = MinHeight

End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Resize-ом окна

Сообщение Хакер » 10.05.2010 (Пн) 18:17

Очень просто и ОЧЕНЬ×ОЧЕНЬ погано.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 254
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Проблема с Resize-ом окна

Сообщение hclubmk » 10.05.2010 (Пн) 21:17

Хакер покажи, пожалуйста, решение с SetWindowPlacement. MSDN, да и на MVPs - только через сабклассинг.
Научились ли Вы радоваться трудностям?

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Проблема с Resize-ом окна

Сообщение VBTerminator » 11.05.2010 (Вт) 13:18

Хакер писал(а):Очень просто и ОЧЕНЬ×ОЧЕНЬ погано.

Почему?

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

Re: Проблема с Resize-ом окна

Сообщение iGrok » 11.05.2010 (Вт) 13:40

VBTerminator писал(а):
Хакер писал(а):Очень просто и ОЧЕНЬ×ОЧЕНЬ погано.

Почему?

Потому, что ты явно не читал первый же пост.
label:
cli
jmp label

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Проблема с Resize-ом окна

Сообщение VBTerminator » 11.05.2010 (Вт) 14:26

А, да... Что-то я сглупил.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 17

    TopList