Tipp 10.13 - MinMax beeinflussen
Wie kann ich die MinMax-Schaltflächen einer Form beeinflussen?
Mit dieser Funktion können Sie die MinMax-Schaltflächen einer Form beeinflussen. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.
Verwendete Win32-Api-Aufrufe und Typen: CallWindowProc, SetWindowLong, CopyMemory - POINTAPI, MINMAXINFO
Beispiel:
'// -------------------------------------------------------- '// *** A C H T U N G *** A C H T U N G *** A C H T U N G ** '// -------------------------------------------------------- '// Diese Beispiel benutzt SubClassing in dem es sich in das '// Windows Nachrichtensystem "einklinkt"; '// das bedeutet für die Anwendung in der IDE: '// 1. Kein Benutzung des End-Befehls '// 2. Kein Debuggen (F8) innerhalb der SubClassing Methode '// 3. Rückgabe an das Betriebssystem bei Programmende '// -------------------------------------------------------- '// >> Quellcode für die Form << '// -------------------------------------------------------- Option Explicit Private Sub Form_Load() '// -------------------------------------------------------- '// In das Windows-Nachrichtensystem "einklinken" '// -------------------------------------------------------- g_nProcOld = SetWindowLong(hwnd, _ GWL_WNDPROC, _ AddressOf WindowProc) End Sub Private Sub Form_Unload(Cancel As Integer) '// -------------------------------------------------------- '// WICHTIG: Nachrichtenbehandlung an Windows zurückgeben! '// -------------------------------------------------------- Call SetWindowLong(hwnd, GWL_WNDPROC, g_nProcOld) End Sub '// -------------------------------------------------------- '// >> Quellcode für das Modul << '// -------------------------------------------------------- Option Explicit Public Const GWL_WNDPROC As Long = (-4&) Public Const WM_GETMINMAXINFO As Long = &H24& Public Type POINTAPI x As Long y As Long End Type Public Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type Public 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 Declare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long) 'Pointer für den Orginal Message-Handler! Public g_nProcOld As Long Public Function WindowProc(ByVal hwnd As Long, _ ByVal iMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long '// -------------------------------------------------------- '// Funktion: |Implementierung des Message-Handlers '// -------------------------------------------------------- '// Parameter: |gemäß dem Windows Message System '// -------------------------------------------------------- '// Rückgabe: |Nachricht an das System! '// -------------------------------------------------------- '// Autor: | Stefan Kulpa '// | EDV Innovation & Consulting - Dormagen '// -------------------------------------------------------- Select Case iMsg Case WM_GETMINMAXINFO '// ------------------------------------------------ '// Nachricht, die "abgefangen" werden soll !!!! '// ------------------------------------------------ Dim udtMINMAXINFO As MINMAXINFO Dim nWidthPixels As Long Dim nHeightPixels As Long '// ------------------------------------------------ '// Aktuelle Größen ermitteln '// ------------------------------------------------ nWidthPixels = _ Screen.Width \ Screen.TwipsPerPixelX nHeightPixels = _ Screen.Height \ Screen.TwipsPerPixelY '// ------------------------------------------------ '// Struktur kopieren '// ------------------------------------------------ CopyMemory udtMINMAXINFO, _ ByVal lParam, _ Len(udtMINMAXINFO) '// ------------------------------------------------ '// Neue Größen zuweisen '// ------------------------------------------------ With udtMINMAXINFO '// -------------------------------------------- '// Breite setzen '// -------------------------------------------- .ptMaxSize.x = _ nWidthPixels - (nWidthPixels \ 4) '// -------------------------------------------- '// Höhe setzen '// -------------------------------------------- .ptMaxSize.y = _ nHeightPixels - (nHeightPixels \ 4) '// -------------------------------------------- '// Links Position setzen '// -------------------------------------------- .ptMaxPosition.x = nWidthPixels \ 8 '// -------------------------------------------- '// Oben Position setzen '// -------------------------------------------- .ptMaxPosition.y = nHeightPixels \ 8 '// -------------------------------------------- '// Maximal erlaubte Breite setzen '// -------------------------------------------- .ptMaxTrackSize.x = .ptMaxSize.x '// -------------------------------------------- '// Maximal erlaubte Höhe setzen '// -------------------------------------------- .ptMaxTrackSize.y = .ptMaxSize.y '// -------------------------------------------- '// Minimal Werte für die Breite setzen '// -------------------------------------------- .ptMinTrackSize.x = nWidthPixels \ 4 .ptMinTrackSize.y = nHeightPixels \ 4 End With '// ------------------------------------------------ '// Struktur in die Windows Struktur zurückkopieren '// ------------------------------------------------ CopyMemory ByVal lParam, _ udtMINMAXINFO, _ Len(udtMINMAXINFO) '// ------------------------------------------------ '// 0 zurückgeben, um Windows mitzuteilen, '// dass die Nachricht 'bearbeitet' wurde '// ------------------------------------------------ WindowProc = 0& Exit Function End Select '// -------------------------------------------------------- '// Alle anderen Nachrichten an windows weiterleiten '// -------------------------------------------------------- WindowProc = CallWindowProc(g_nProcOld, _ hwnd, _ iMsg, _ wParam, _ lParam) End Function