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.

Api-AufrufeVerwendete 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