Les classes SubClass et ISubClass du composant Active SubClass Hook & Timer permettent d'intercepter les messages envoyés à une fenêtre Windows. Cet exemple montre l'utilisation de ces classes pour forcer la retaille d'une fenêtre dans un intervalle fixe en interceptant le message WM_GETMINMAXINFO envoyé par Windows lors de la retaille d'une fenêtre.

La fenêtre intègre deux contrôles graphiques Shape matérialisant la zone de retaille autorisée. Retaillez la fenêtre pour constater le traitement du message par l'application.

Cette application nécessite les composants suivants : Windows API for Visual Basic, Active SubClass Hook & Timer.

La classe ISubClass est une classe d'instantiation PublicNotCreatable, elle doit être utilisée sous la forme d'une clause Implements ISubClass. Il est impératif ensuite d'implementer la propriété ISubClass_MessageResponse pour gérer la manière dont le message est consommé et la fonction ISubClass_WindowProc pour le traitement du message en question.

Option Explicit

Implements ISubclass

' Implementation de ISubClass_MessageResponse
Private Property Get ISubClass_MessageResponse() As ISubClassMessageResponse
  ISubClass_MessageResponse = scMsgConsume
End Property

' Implementation de ISubClass_WindowProc
Private Function ISubClass_WindowProc(ByVal hWnd As LongByVal Msg As LongByVal wParam As LongByVal lParam As LongAs Long

  Dim MMI As MINMAXINFO
  If Msg = WM_GETMINMAXINFO Then

    Debug.Print "WM_GETMINMAXINFO"
    CopyMemory MMI, ByVal lParam, LenB(MMI)
    With MMI
      .ptMinTrackSize.x = (Me.Width - Me.ScaleWidth + shMin.Left + shMin.Width + 120) \ Screen.TwipsPerPixelX
      .ptMinTrackSize.y = (Me.Height - Me.ScaleHeight + shMin.Top + shMin.Height + 120) \ Screen.TwipsPerPixelY
      .ptMaxTrackSize.x = (Me.Width - Me.ScaleWidth + shMax.Left + shMax.Width + 120) \ Screen.TwipsPerPixelX
      .ptMaxTrackSize.y = (Me.Height - Me.ScaleHeight + shMax.Top + shMax.Height + 120) \ Screen.TwipsPerPixelY
    End With
    CopyMemory ByVal lParam, MMI, LenB(MMI)
    ISubClass_WindowProc = 0
  End If

End Function

La classe SubClass est une classe d'instantiation GlobalMultiUse. Il est nécessaire d'attacher chaque Message que l'on souhaite intercepter au chargement de la fenêtre et inversement détacher ceux-ci au déchargement de la fenêtre.

' Au chargement de la fenêtre
Private Sub Form_Load()
  AttachMessage Me, Me.hWnd, WM_GETMINMAXINFO
End Sub

' Au déchargement de la fenêtre
Private Sub Form_Unload(Cancel As Integer)
  DetachMessage Me, Me.hWnd, WM_GETMINMAXINFO
End Sub

Vous trouverez de d'autres exemples d'utilisation de la classe ISubClass dans les contrôles VisualBasic.

Cette application de démonstration nécessite l'installation du composant suivant : Active SubClass Hook & Timer.