Limiter la taille du'une fenêtre (hook d'une fenêtre)

Soyez le premier à donner votre avis sur cette source.

Vue 9 539 fois - Téléchargée 637 fois

Description

Cette petite source vous montreras comment hooker une fenêtre, c'est-à-dire intercepter certains messages Windows à destination d'une fenêtre, et ainsi interprêter ces messages à votre façon.

Le hooking est utilisé ici pour limiter le redimensionnement d'une feuille à une taille minimale et maximale pour la largeur et la hauteur (personnalisable bien sûr).

Vous pouvez ainsi laissez vos feuilles redimensionnables, et si vous voulez imposer une taille minimale et maximale à vos feuille, c'est possible avec cette source.

Auparavant, j'utilisais une méthode bien moins esthétique : je désactivais le focus de la feuille, la redimensionnais, et lui redonnais le focus. Ainsi, la feuille avait bien des limites de taille, mais on perdais le redimensionnement dès que la feuille était trop grande ou trop petite. Avec cette source, vous pouvez faire de même, mais vous garder la possibilité de redimensionner la feuille en lui imposant des limites tout de même.

Il vous suffit de cliquer sur le bouton "limiter le dimensionnement" pour modifier la procédure de fenêtre et ainsi, limiter le redimensionnement.

Source / Exemple :


'Fonction principale pour limiter le redimensionnement :

Public Function LimiterDimensionFeuille(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
'=========================================================================================================
'Nouvelle fonction de traitement de message de la fenêtre pour intercepter les messages et la magnétiser
'=========================================================================================================

'on active la routine de traitement d'erreur
On Error Resume Next
'l'erreur etant minime, on continue l'éxécution normalement

'déclaration des variables privées
Dim rctPosition As RECT 'stocke la position et la taille de la fenêtre
Dim bQuitter As Boolean 'stocke l'état d'activation de sortie de la fonction

    'on initialise l'état de sortie de la fonction
    Let bQuitter = False
    
    'on évite de traiter le message si l'ancienne fonction est invalide
    If lAncienneFonction = 0 Then Exit Function
    
    'on intercepte le message de début de déplacement ou de redimensionnement et on le traire
    If wMsg = WM_ENTERSIZEMOVE Then
        
        'on récupère la position de la feuille et de la souris
        Call GetWindowRect(hWnd, rctPosition)
        
    'on récupère les messages de redimensionnement et de déplacement et on les traite
    ElseIf wMsg = WM_SIZING Then

        'On récupère la position de fenêtre
        Call CopyMemory(rctPosition, ByVal lParam, Len(rctPosition))
            
        'on définit la taille de la feuille selon le changement de taille
        If rctPosition.Right - rctPosition.Left < lWidthMin Then

            Let rctPosition.Right = rctPosition.Left + lWidthMin

        ElseIf rctPosition.Right - rctPosition.Left > lWidthMax Then

            Let rctPosition.Right = rctPosition.Left + lWidthMax

        End If
        If rctPosition.Bottom - rctPosition.Top < lHeightMin Then

            Let rctPosition.Bottom = rctPosition.Top + lHeightMin

        ElseIf rctPosition.Bottom - rctPosition.Top > lHeightMax Then

            Let rctPosition.Bottom = rctPosition.Top + lHeightMax

        End If
                        
        'on définit la position de la fenêtre
        Call CopyMemory(ByVal lParam, rctPosition, Len(rctPosition))

        'on définit la valeur de la fonction de traitement de message de la fenêtre qui doit être 1
        Let LimiterDimensionFeuille = 1
        
        'pas la peine d'appeller la fonction de traitement standard.
        Let bQuitter = True
        
    End If
    
    'on appelle la fonction de traitement standard des messages pour le reste des messages
    If Not bQuitter Then Let LimiterDimensionFeuille = CallWindowProc(lAncienneFonction, hWnd, wMsg, wParam, lParam)
    
End Function

Conclusion :


Je ne pense pas faire de mise à jour de cette source, à moins qu'il y ai des bugs fâcheux.

Note : veuillez bien fermer le programme par le bouton de fermeture, et non à partir de VB si vous ne voulez pas fermer VB en même temps : VB n'aime pas trop qu'on modifier les procédures de fenêtres... :(

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de cs_Urgo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.