Manchmal ist es notwendig oder erwünscht, daß zwar ein Fenster in der Größe vberändert werden darf, jedoch mit zwei Einschränkungen: Option Explicit Private WinOldProcMinMax Private Const GWL_WNDPROC = (-4) ' Die Nachricht WM_GETMINMAXINFO wird an ein Fenster ' geschickt, bevor es vergrößert bzw. verkleinert wird Private Const WM_GETMINMAXINFO = &H24 Private lX1 As Long Private lX2 As Long Private lY1 As Long Private lY2 As Long 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 ' Minimale Größe ptMaxTrackSize As POINTAPI ' Maximale Größe End Type Private Declare Function DefWindowProc Lib "user32" _ Alias "DefWindowProcA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam 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 Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" ( _ ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ ByVal Destination As Any, _ ByVal Source As Any, _ ByVal Length As Long) Private Declare Sub CopyMemory1 Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Destination As MINMAXINFO, _ ByVal Source As Long, _ ByVal Length As Long) Private Declare Sub CopyMemory2 Lib "kernel32" _ Alias "RtlMoveMemory" ( _ ByVal Destination As Long, _ Source As MINMAXINFO, _ ByVal Length As Long) Aktiviert wird das ganze mit dem AdressOf-Operator. ' AufrufProzedur ' Am besten im Form_Load-Ereignis aufrufen Public Sub SetMinMax(Form As Form, x1 As Long, _ y1 As Long, x2 As Long, y2 As Long) WinOldProcMinMax = SetWindowLong(Form.hWnd, _ GWL_WNDPROC, AddressOf WindowProcMinMax) lX1 = x1 lX2 = x2 lY1 = y1 lY2 = y2 End Sub ' Normalzustand wiederherstellen ' WICHTIG! Vor dem Beenden der Form aufrufen Public Sub UnloadMinMax(Form As Form) SetWindowLong Form.hWnd, GWL_WNDPROC, _ WinOldProcMinMax End Sub ' Hier kommen alle Nachrichten an, die an daß Fenster ' geschickt werden Private Function WindowProcMinMax(ByVal hWnd As Long, _ ByVal uMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim ret As Long Dim MM As MINMAXINFO If uMsg = WM_GETMINMAXINFO Then CopyMemory1 MM, lParam, Len(MM) With MM .ptMinTrackSize.x = lX1 .ptMinTrackSize.y = lY1 .ptMaxTrackSize.x = lX2 .ptMaxTrackSize.y = lY2 End With CopyMemory2 lParam, MM, Len(MM) ret = DefWindowProc(hWnd, uMsg, wParam, lParam) Else ' Wenn andere Nachricht, dann "durchlassen" ret = CallWindowProc(WinOldProcMinMax, hWnd, uMsg, _ wParam, lParam) End If WindowProcMinMax = ret End Function Ab hier braucht es nur noch den Aufruf aus (irgend-)einer Form, der am besten im Form_Load-Ereignis steht. Natürlich kann der Maximalwert auch weit über dem Windows-Standard liegen... ' Größeneinschränkung festlegen Private Sub Form_Load() SetMinMax Me, 200, 200, 500, 500 End Sub ' WICHTIG: Normalzustand wiederherstellen Private Sub Form_QueryUnload(Cancel As Integer, _ UnloadMode As Integer) UnloadMinMax Me End Sub So, das ist das Grundprinzip der Funktion. Dieser Tipp wurde bereits 23.836 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Tipp des Monats Mai 2024 Hermann Röttger Wochentage eines Datumsbereichs ermitteln Wochentage eines Datumsbereichs ermitteln, optional mit Feiertagsberechnung Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |