begin process at 2008 05 16 05:14:41
1 173 215 membres
58 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

USERFORM AVEC FONCTIONS MAXIMISER, MINIMISER ET ETIRABLE UTILISANT LES API WINDOWS


Information sur la source

Catégorie :VBA Classé sous : userform, dimension, maximiser, minimiser, api Niveau : Débutant Date de création : 05/07/2007 Vu : 4 740

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Pour un autre code en cours de développement, j'avais besoin d'avoir un Userform avec les possibilité de dimensionnement d'une fenêtre classique (bouton maximiser, minimiser, etc...).
Afin de pouvoir l'utiliser sur plusieurs Userform, j'ai décidé de mettre ce code sous forme de Classe qui peut alors être incluse dans tout projet existant ou à venir.
Ce code a été développé sur Word 2000. Il est à mon avis compatible Excel et autre version des deux programmes.

Remarque: C'est ma première contribution, alors je suis ouvert à toute critique (constructive, bien sur)
Merci à tous ceux qui postent des codes ici, ils sont une source inépuisable de trucs & astuces (bien plus que l'aide de Micromachin)

Source

  • 'Dans votre projet insérez une classe nommée "UFCustomProperties" dont voici le code:
  • '*** Définitions des variables locales & fonctions ***
  • ' Fonction d'acquisition de l'identifiant de la fenêtre active
  • Private Declare Function GAW Lib "user32" Alias "GetActiveWindow" () As Long
  • ' Fonction d'acquisition du titre de la Window hwnd
  • Private Declare Function GWT Lib "user32" Alias "GetWindowTextA" _
  • (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  • ' Fonction de changement du titre de la Window hwnd (si existant)
  • Private Declare Function SWT Lib "user32" Alias "SetWindowTextA" _
  • (ByVal hwnd As Long, ByVal lpString As String) As Boolean
  • ' Fonction d'acquisition
  • Private Declare Function GWL Lib "user32" Alias "GetWindowLongA" _
  • (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  • ' Fonction de changement
  • Private Declare Function SWL Lib "user32" Alias "SetWindowLongA" _
  • (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  • ' Déclaration des variables internes
  • Private Const GWL_STYLE As Long = -16
  • Private Const WS_THICKFRAME = &H40000 'Cadre fin pour redimensionnement
  • Private Const WS_MINIMIZEBOX = &H20000 'Bouton "Réduire"
  • Private Const WS_MAXIMIZEBOX = &H10000 'Bouton "Agrandir"
  • Private Const WS_MINIMIZED = &H20000000 'Etat Réduit
  • Private Const WS_MAXIMIZED = &H1000000 'Etat Agrandi
  • Private Const WS_FULLSIZING = &H70000 'Les 3 propriétés ensembles
  • Private stTmp As String, lgTmp As Long, lgRet As Long, Whdl As Long
  • '*** Acquisition du Handle de la Userform ***
  • '*** pour initialisation ***
  • Public Function Initialisation()
  • Whdl = GAW
  • End Function
  • '*** Définition des propriétés ***
  • ' Bouton Agrandir
  • Public Property Get MaximizeBox() As Boolean
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • If OldProp = (OldProp Or WS_MAXIMIZEBOX) Then
  • MaximizeBox = True
  • Else
  • MaximizeBox = False
  • End If
  • End Property
  • Public Property Let MaximizeBox(Enable As Boolean)
  • If MaximizeBox <> Enable Then
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • SWL Whdl, GWL_STYLE, OldProp Xor WS_MAXIMIZEBOX 'Changement propriétés
  • End If
  • End Property
  • ' Bouton Réduire
  • Public Property Get MinimizeBox() As Boolean
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • If OldProp = (OldProp Or WS_MINIMIZEBOX) Then
  • MinimizeBox = True
  • Else
  • MinimizeBox = False
  • End If
  • End Property
  • Public Property Let MinimizeBox(Enable As Boolean)
  • If MinimizeBox <> Enable Then
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • SWL Whdl, GWL_STYLE, OldProp Xor WS_MINIMIZEBOX 'Changement propriétés
  • End If
  • End Property
  • ' Etat Agrandi
  • Public Property Get Maximized() As Boolean
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • If OldProp = (OldProp Or WS_MAXIMIZED) Then
  • Maximized = True
  • Else
  • Maximized = False
  • End If
  • End Property
  • ' Etat Réduit
  • Public Property Get Minimized() As Boolean
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • If OldProp = (OldProp Or WS_MINIMIZED) Then
  • Minimized = True
  • Else
  • Minimized = False
  • End If
  • End Property
  • ' Cadre de re-dimensionnement
  • Public Property Get ThickFrame() As Boolean
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • If OldProp = (OldProp Or WS_THICKFRAME) Then
  • ThickFrame = True
  • Else
  • ThickFrame = False
  • End If
  • End Property
  • Public Property Let ThickFrame(Enable As Boolean)
  • If ThickFrame <> Enable Then
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • SWL Whdl, GWL_STYLE, OldProp Xor WS_THICKFRAME 'Changement propriétés
  • End If
  • End Property
  • ' Tous les attributs de Re-dimensionnement
  • Public Function FullSizing()
  • OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
  • SWL Whdl, GWL_STYLE, OldProp Or WS_FULLSIZING 'Changement propriétés
  • End Function
  • ' Changement de titre
  • ' ATTENTION: L'utilisation de la propriété "Caption" pour changer
  • ' le titre de la fenêtre inhibe les boutons "Agrandir" & "Réduire"
  • Public Property Get Title() As String
  • 'Acquisition Titre pour cohérence avec changement
  • 'la propriété "Caption" peut être utilisée pour
  • 'acquérir le titre de la Userform
  • stTmp = Space$(120)
  • lgTmp = 119
  • GWT Whdl, stTmp, lgTmp
  • Title = stTmp
  • End Property
  • Public Property Let Title(NewTitle As String)
  • SWT Whdl, NewTitle
  • End Property
  • ' Dans un Userform ajoutez le code suivant
  • Public CustomProperties As UFCustomProperties
  • '*** Initialisation des propriétés de la fenêtre ***
  • Private Sub UserForm_Activate()
  • Set CustomProperties = New UFCustomProperties
  • Me.CustomProperties.Initialisation 'Acquisition du Handle de la Userform
  • Me.CustomProperties.FullSizing
  • ' Move la Userform pour faire apparaître les boutons
  • ' Sinon il n'apparaisse qu'aprés avoir bougé la Userform
  • ' Je ne sais pas pourquoi mais c'est comme ça
  • Me.Left = Me.Left + 1
  • Me.Left = Me.Left - 1
  • End Sub
'Dans votre projet insérez une classe nommée "UFCustomProperties" dont voici le code:

'*** Définitions des variables locales & fonctions ***
' Fonction d'acquisition de l'identifiant de la fenêtre active
Private Declare Function GAW Lib "user32" Alias "GetActiveWindow" () As Long
' Fonction d'acquisition du titre de la Window hwnd
Private Declare Function GWT Lib "user32" Alias "GetWindowTextA" _
    (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
' Fonction de changement du titre de la Window hwnd (si existant)
Private Declare Function SWT Lib "user32" Alias "SetWindowTextA" _
    (ByVal hwnd As Long, ByVal lpString As String) As Boolean
' Fonction d'acquisition
Private Declare Function GWL Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
' Fonction de changement
Private Declare Function SWL Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

' Déclaration des variables internes
Private Const GWL_STYLE As Long = -16
Private Const WS_THICKFRAME = &H40000       'Cadre fin pour redimensionnement
Private Const WS_MINIMIZEBOX = &H20000      'Bouton "Réduire"
Private Const WS_MAXIMIZEBOX = &H10000      'Bouton "Agrandir"
Private Const WS_MINIMIZED = &H20000000      'Etat Réduit
Private Const WS_MAXIMIZED = &H1000000       'Etat Agrandi
Private Const WS_FULLSIZING = &H70000             'Les 3 propriétés ensembles

Private stTmp As String, lgTmp As Long, lgRet As Long, Whdl As Long

'*** Acquisition du Handle de la Userform ***
'***        pour initialisation           ***
Public Function Initialisation()
    Whdl = GAW
End Function

'*** Définition des propriétés ***
' Bouton Agrandir
Public Property Get MaximizeBox() As Boolean
OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
If OldProp = (OldProp Or WS_MAXIMIZEBOX) Then
    MaximizeBox = True
Else
    MaximizeBox = False
End If
End Property
Public Property Let MaximizeBox(Enable As Boolean)
If MaximizeBox <> Enable Then
    OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
    SWL Whdl, GWL_STYLE, OldProp Xor WS_MAXIMIZEBOX    'Changement propriétés
End If
End Property
' Bouton Réduire
Public Property Get MinimizeBox() As Boolean
OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
If OldProp = (OldProp Or WS_MINIMIZEBOX) Then
    MinimizeBox = True
Else
    MinimizeBox = False
End If
End Property
Public Property Let MinimizeBox(Enable As Boolean)
If MinimizeBox <> Enable Then
    OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
    SWL Whdl, GWL_STYLE, OldProp Xor WS_MINIMIZEBOX    'Changement propriétés
End If
End Property
' Etat Agrandi
Public Property Get Maximized() As Boolean
OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
If OldProp = (OldProp Or WS_MAXIMIZED) Then
    Maximized = True
Else
    Maximized = False
End If
End Property
' Etat Réduit
Public Property Get Minimized() As Boolean
OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
If OldProp = (OldProp Or WS_MINIMIZED) Then
    Minimized = True
Else
    Minimized = False
End If
End Property
' Cadre de re-dimensionnement
Public Property Get ThickFrame() As Boolean
OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
If OldProp = (OldProp Or WS_THICKFRAME) Then
    ThickFrame = True
Else
    ThickFrame = False
End If
End Property
Public Property Let ThickFrame(Enable As Boolean)
If ThickFrame <> Enable Then
    OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
    SWL Whdl, GWL_STYLE, OldProp Xor WS_THICKFRAME 'Changement propriétés
End If
End Property
' Tous les attributs de Re-dimensionnement
Public Function FullSizing()
    OldProp = GWL(Whdl, GWL_STYLE) 'Acquisition propriétés
    SWL Whdl, GWL_STYLE, OldProp Or WS_FULLSIZING 'Changement propriétés
End Function

' Changement de titre
' ATTENTION: L'utilisation de la propriété "Caption" pour changer
' le titre de la fenêtre inhibe les boutons "Agrandir" & "Réduire"
Public Property Get Title() As String
    'Acquisition Titre pour cohérence avec changement
    'la propriété "Caption" peut être utilisée pour
    'acquérir le titre de la Userform
    stTmp = Space$(120)
    lgTmp = 119
    GWT Whdl, stTmp, lgTmp
    Title = stTmp
End Property
Public Property Let Title(NewTitle As String)
    SWT Whdl, NewTitle
End Property

' Dans un Userform ajoutez le code suivant

Public CustomProperties As UFCustomProperties

'*** Initialisation des propriétés de la fenêtre ***
Private Sub UserForm_Activate()
Set CustomProperties = New UFCustomProperties
Me.CustomProperties.Initialisation   'Acquisition du Handle de la Userform

Me.CustomProperties.FullSizing

' Move la Userform pour faire apparaître les boutons
' Sinon il n'apparaisse qu'aprés avoir bougé la Userform
' Je ne sais pas pourquoi mais c'est comme ça
Me.Left = Me.Left + 1
Me.Left = Me.Left - 1
End Sub

Conclusion

Dans cet exemple on active toutes les propriétés (fonction "FullSizing")
Le code de la classe permet de les gérer individuellement (utile si on veut interdire le maximiser etc...)

ATTENTION:
L'utilisation de la propriété "Caption" pour changer le titre de la fenêtre inhibe les boutons "Agrandir" & "Réduire", utilisez alors UFCustomProperties.Title
Enfin, aprés avoir activé ou désactivé les boutons Maximiser et/ou minimiser, il faut bouger la Userform pour raffraichir l'affichage (je ne sais pas pourquoi).
  • signaler à un administrateur
    Commentaire de allthew3 le 05/07/2007 15:24:28

    et pourquoi utiliser les APIs quand on est pas obligé ?

  • signaler à un administrateur
    Commentaire de cameron91 le 05/07/2007 16:59:57

    Si il existe une autre solution en VBA Word 2000, merci de me la communiquer, moi je ne l'ai pas trouvée.

  • signaler à un administrateur
    Commentaire de allthew3 le 05/07/2007 17:49:49

    ah ouais bien : je croyais que c'était du VB6
    désolé

  • signaler à un administrateur
    Commentaire de zavier666 le 05/07/2007 17:51:19

    Même si ton code est très bien écrit et bien commenté, je te confirme qu'il est possible de
    tout faire directement depuis VBA.

    En revanche ces API sont très pratique pour modifier des fenêtres d'autres programmes.

    slts!
    ___________________________________________________
    Toujours + de VB et d'API => APi @ la Loupe
    http://apialaloupe.free.fr

  • signaler à un administrateur
    Commentaire de cameron91 le 05/07/2007 18:13:08

    Merci du compliment zavier666.
    Peux-tu m'indiquer ou trouver comment faire en VBA?

  • signaler à un administrateur
    Commentaire de PCPT le 05/07/2007 21:45:47 administrateur CS

    salut,
    important : les API sont par chance référencées (toile), c'est préférable de les utiliser telles quelles.
    le dev c'est c'est pas trop de la radinerie de saisie... ^^

  • signaler à un administrateur
    Commentaire de mortalino le 09/07/2007 13:41:22

    Salut, suis d'accord avec PCPT, la misère à celui qui [re]travaillera sur ton dev.

    Zavier666, comment faire sans API ?

  • signaler à un administrateur
    Commentaire de zavier666 le 09/07/2007 17:34:44

    Mea culpa, je n'avais pas tout regardé, c'est vrai que tout n'est pas faisable

    slts!
    _______________________________________________________
    Toujours + de VB et d'API => APi @ la Loupe
    http://apialaloupe.free.fr

  • signaler à un administrateur
    Commentaire de cameron91 le 11/07/2007 10:45:51

    Salut,
    A l'attention de PCPT: Tu me croiras ou pas, mais je viens de découvrir ton code sur le même sujet. Il est trés bien fait et a des fonctions supplémentaires au mien.
    Le seul pb c'est qu'il n'est pas en VBA mais en VB.

  • signaler à un administrateur
    Commentaire de PCPT le 11/07/2007 17:34:15 administrateur CS

    Salut,
    A l'attention de cameron91: Tu me croiras ou pas, mais j'ai découvert ton code la semaine dernière. Il est...fait, a des côtés peu pratiques, des API nommées à la va-vite, est peu portable et a moins de fonctions que le mien.
    Autre pb c'est qu'il n'est pas en VB6 mais en VBA. :D

    mouahhaaa, non j'te crois ^^
    par contre n'hésites pas à t'inspirer de ma classe pour modifier ton code, çà risque d'être bénéfique ;)

    ++

  • signaler à un administrateur
    Commentaire de Gyre30 le 27/07/2007 10:45:09

    Bonjour
    D'abord merci pour ce petit bout de code qui me simplifie grandement la vie.
    Par contre j'ai un petit probleme.
    Le code marche nickel sur mes différentes userforms sauf une ou j'ai une Spreadsheet.
    Je ne m'y connais pas assez pour comprendre le pourquoi de la chose. En fait: La userform affiche bien les icones réduire agrandir, mais le clique n'a aucun effet dessus. J'ai remarqué que la croix (Qui marche) ferme bien la user forme mais c'est une croix qui est décalée d'un pixel comme si elle se trouvait derrière l'image d'une première croix.

    Bref ca ne marche pas, et ça marche si j'enleve la Spreadsheet...
    Help SVP

  • signaler à un administrateur
    Commentaire de Gyre30 le 27/07/2007 10:59:26

    Rebonjour
    Je réponds à mon propre message.
    J'ai trouver un moyen de faire marcher mon application.

    Le problème venait du fait que dans Userform_Inisalize ()
    Après avoir mis ce bout de code j'ajoutais des valeurs dans la spreadsheet, puis je lui donnais le focus.
    J'ai juste écris le code après l'incrémentation de la spreadsheet.
    J'espère que ça pourra aider certains.
    et encore merci.

    Gyre

  • signaler à un administrateur
    Commentaire de cobra2008 le 30/10/2007 10:14:28

    Salut cameron91
    Je suis novice en VBA (je ne développe que depuis hier sous Excel)
    ton code est très interressant, mais je n'arrive pas à interdire le plein écran de ma useform (cela doit être trois fois rien mais comme je ne maitrise pas du tout le code et l'interface, je passe à côté)
    Ce que je voudrais faire, c'est soit ne pas afficher le bouton "maximize" ou si cela n'est pas possible, arriver à lire l'évenement quand on appui dessus pour interdire le plein écran de la fenêtre

    Merci d'avance à ceux ou celles qui pourront m'aider

  • signaler à un administrateur
    Commentaire de 2pme le 25/11/2007 14:35:58

    Pour faire apparaitre les boutons Minimiser, Maximiser après les avoir associés à la fenêtre
    il suffit de redessiner le menu du UserForm avec DrawMenuBar Whdl

    La déclaration de la fonction DrawMenuBar :

    Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal m_hWnd As Long) As Long

    En plus, le fait d'exécuter DrawMenuBar dispense de passer par la propiété Title.
    En passant ton code est privé de Option Explicit.

    2pme

  • signaler à un administrateur
    Commentaire de Eleasias le 26/03/2008 09:24:10 10/10

    Bonjour,
    je suis débutant en VBA et j'aimerai que ma fenêtre s'ouvre en plein écran par défaut, quelqu'un peut me dire comment faire?
    Merci d'avance

Ajouter un commentaire

Discussions en rapport avec ce code source

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS