Страница: 1 |
Типа дело такое... Имеется форма. Изменяю размеры формы, форму можно уменьшить до миннимума. А, допустим, необходимо, чтобы минимальные размеры формы были 200х200 (так, к примеру). В Form_Resize добавляю нужный код, но при попытке уменьшить ширину или высоту до рамеров менее 200 единиц форма на некоторый промежуток времени (<1 мс) принимает размеры менее 200 единиц, при этом границы как бы нооровятся вернуться назад, но мышь то двигается, и получается такой себе ОЧЕНЬ НЕКРАСИВЫЙ ЭФФЕКТ((( Запутано както написал, конечно... Но если кто то не понял, вот код, всавьте в любой проект и поизменяйте размеры формы. Всё поймете. Private Sub Form_Resize()
В форме написать: Private Const GWL_WNDPROC = (-4) Private Sub Form_Load() OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage) End Sub Private Sub Form_Unload(Cancel As Integer) Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc) End Sub А в модуле: Public OldWindowProc As Long ' Original window proc Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 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 Public Const WM_GETMINMAXINFO = &H24 Type POINTAPI x As Long y As Long End Type Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long If Msg = WM_GETMINMAXINFO Then Dim MinMax As MINMAXINFO CopyMemory MinMax, ByVal lp, Len(MinMax) MinMax.ptMinTrackSize.x = 200 \ Screen.TwipsPerPixelX MinMax.ptMinTrackSize.y = 200\ Screen.TwipsPerPixelY MinMax.ptMaxTrackSize.x = Screen.Width \ Screen.TwipsPerPixelX MinMax.ptMaxTrackSize.y = Screen.Height \ Screen.TwipsPerPixelY CopyMemory ByVal lp, MinMax, Len(MinMax) SubClass1_WndMessage = 1 Exit Function End If SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp) End Function спасиба))))) спасиба))))) спасиба))))) Эт апять я... Короче, проверил етот код, и вот что скажу: ничего он не делает.... Т.е. он при загрузке формы бирёт и делает мне минимальные размеры формы... А глюки с РЕСАЙЗОМ так и остались... =========================== а может вы не тот код дали? Это CALLBACK-функция, вызываемая ОС при воздействии на окно. В Resize можешь ничего не писать. Хотя, у меня тоже возникали глюки с этим способом, но зато окно не уменьшается и не увеличивается за пределы заданных размеров. MinMax.ptMinTrackSize.x = 200 \ Screen.TwipsPerPixelX - мин. ширина окна MinMax.ptMinTrackSize.y = 200\ Screen.TwipsPerPixelY - мин. высота окна MinMax.ptMaxTrackSize.x = Screen.Width \ Screen.TwipsPerPixelX - макс. ширина окна MinMax.ptMaxTrackSize.y = Screen.Height \ Screen.TwipsPerPixelY - макс. высота окна Но возможно, я чего-то не понял?.. Страница: 1 |
Вопрос: Resizzzze
Добавлено: 28.06.03 00:56
Автор вопроса: Zeus | Web-сайт:
If WindowState = vbMinimized Then Exit Sub
If Me.Height < 5000 Then Me.Height = 5000
If Me.Width < 5000 Then Me.Width = 5000
End Sub
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #1
Добавлено: 28.06.03 09:19
Номер ответа: 2
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #2
Добавлено: 30.06.03 13:52
Номер ответа: 3
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #3
Добавлено: 30.06.03 13:52
Номер ответа: 4
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #4
Добавлено: 30.06.03 13:53
Номер ответа: 5
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #5
Добавлено: 30.06.03 14:00
Номер ответа: 6
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #6
Добавлено: 30.06.03 15:06
Номер ответа: 7
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #7
Добавлено: 30.06.03 15:08
А Resize то тебе зачем уже? Это CALLBACK-функция
Номер ответа: 8
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #8
Добавлено: 08.07.03 00:14
спсбо, понял все!