Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Redimensionner un UserForm après le retrait de la barre du menu système (Caption)

Dudu2

XLDnaute Barbatruc
Bonjour,

Suite à un sujet récent sur une barre de progression dont on peut retirer le Caption (la barre de menu système) via l'API, se pose la question de redimensionner le UserForm à sa taille sans le Caption.

En faisant un fichier de test j'ai (je pense) trouvé une solution qui n'est pas simple du tout et sur laquelle j'ai passé pas mal de temps.

Edit: je retire les commentaires de ce post car une solution beaucoup plus simple est proposée au post suivant.

Il y a peut-être un moyen encore plus simple en jouant sur les flags lors du retrait de la barre de menu système (le Caption) du UserForm via l'API. Avis aux experts !
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
J'admets que tu fais fort en créant une région par API (je ne connais pas du tout ces trucs).
Mais avoue que c'est utiliser une vedette de la SNSM pour pêcher un poisson coque.

De plus ça ne semble pas tout à fait au point, du moins chez moi:


 

Pièces jointes

  • demo userform sans barre de titre trop beau trop jolie.xlsm
    26.4 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
J'admire ta ténacité à essayer de démontrer que tu peux faire mieux et soit disant "plus propre" que mon code qui est d'une simplicité quasi-enfantine, une fois la compréhension des comportements acquise (ce qui a pris pas mal d'heures d'essais et de tests). J'en ai fait une ressource dont j'attends la publication pour en faire la solution à ce sujet.

Mais je suis toujours curieux de voir ce que tu vas sortir (ou pas) après des cogitations furieuses et frénétiques pour concurrencer ma solution et en tirer une satisfaction supérieure .
 

patricktoulon

XLDnaute Barbatruc
re moi j'admire le fait que tu prétende continuer continuer avec un control qui est redimensionné
comment je fait si je ne veux pas redimensionner et que celui ci ne se trouve pas tout a fait en bas
surtout qu'au final je n'ai pas les dimensions voulues comme je l'ai dit plus haut c'est pas rédhibitoire
perso comme je l'ai dit plus haut je cherche pas la précision c'est toi qui la cherche la précision
ce que je t'ai proposer proprement utilise les api tel quel doivent êtres utilisée si ca ne match
pas il va falloir se poser des question pour 1+1 ne fait pas 2 chez toi
quand j'utilise (api ou pas api) taille userform = son intérieur après avoir réduit la barre de titre ,chez moi ça match à 1 point près quelque methode que j'utilise
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je dirais qu'il appartient à chacun d'afficher la suppression du Caption selon ses préférences.
Ici j'ai surtout focalisé sur le redimensionnement exact mais c'est une vision tout à fait personnelle.
D'autre part, vous (@ChTi160 et @patricktoulon) aviez tout à fait raison pour le redimensionnement initial que vous aviez remarqué et dont j'ai expliqué la cause plus haut.
Merci pour votre support et suggestions.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2
juste une idée comme ça si tu veux continuer avec le control comme repère et cobaye
pourquoi n'en rajouterais tu pas un dynamico travailler avec lui et et le supprimer après redimensionnement
le userform initial avec ces controls initials ne seraient pas touchés

en suite je souhaiterais porter a ton attention un problème récurent
en effet je dessine mon userform dans le VBE je place mes controls (jusque là tout est OK)
j'affiche simplement mon userform sans faire quoi que se soit
on se rend compte que
le userform n'est déjà plus tout a fait pareil en faisant abstraction du thème bien évidemment
demonstration
dans le VBE

maintenant je l'affiche toujours sans rien faire dedans
je grossis un peu la capture pour que l'on y vois plus clair

et bien on se rend compte que
celui de gauche est à 0 juste contre le petit cadre fin de la bordure
ainsi que celui du bas et celui du haut
quand celui de droite il a été décalé d'un point vert la droite il est donc plus qu'a 1 point du petit cadre fin

maintenant je vais supprimer la barre de titre est redimensionner avec (comme je te l'ai suggéré) un control dynamique
pour le redimensionnement je vais ajouter un label cobaie tout en bas 15 de haut et la largeur de l'intérieur du userform
et je vais redimensionner le userform avec ce repère
je ne vais pas supprimer le label cobaie pour que tu vois les choses

on se rend compte de quoi :????
et bien qu'en prenant comme repère le inside (width et height) et en redimensionnant selon la position du controls violet(cobaie) ,je retrouve les positions originales de départ
le Label de gauche est bien à cadre fin +1 ainsi que celui du haut et bottom
et mon gauche qui était a 2 points du bord se retrouve à nouveau à 2 points du bord
autrement dit l'affichage original lui même est faux et c'est en reprenant les dimensions telle quelles sont prétendue en VBE que l'on retrouve les positions originales
on a toujours dit . width-inside.width est un calcul approximatif je me rends compte que si le thème ne grossi pas les bordures de fenêtre il est parfaitement exacte

maintenant je supprime le control dynamique violet

VB:
'Enlever la barre de titre d'un userform et retrouver la taille initial dans le inside du userform
'created by patricktoulon
#If Win64 Then
    Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongptrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    Private Declare PtrSafe Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Dim hwnd As LongPtr
#Else
    Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Dim hwnd As Long
#End If

Dim EcX#, EcY# ',W#, H#,  HH#, WW#

Sub NoTitleBar(form)
    Dim lbl As MSForms.Label
    With form
        'récupération des marges d'encadrement
        EcX = .Width - .InsideWidth
        EcY = form.Height - form.InsideHeight
        
        'on ajoute un control Label
        Set lbl = form.Controls.Add("Forms.Label.1", "repère")
        
        ' Définit la position du Label en bas  - sa hauteur-1 , à 0 de gauche et de la largeur de l'interieur de l'userform
        lbl.Left = 0
        lbl.Height = 15
        lbl.Top = form.InsideHeight - lbl.Height - 1

        lbl.Width = form.InsideWidth 'facultatif
        lbl.BorderStyle = 1 'facultatif
        lbl.BackColor = vbMagenta 'facultatif
        lbl.Caption = " Un Label provisoire" 'facultatif

        'on enlève la caption
        hwnd = FindWindowA(vbNullString, form.Caption)
        SetWindowLongA hwnd, -16, &H94080080 'on retire la barre de titre

        'on redimentionne  avec le label repère
        form.Height = lbl.Top + lbl.Height + EcX + 1
        form.Top = form.Top + EcY - EcX 'pour pas le voir sursauter
        'on peut le supprimer
        form.Controls.Remove "repère"
    End With
End Sub

Sub showpat()
    UserForm1.Show 0
End Sub

Sub showpat2()
    NoTitleBar UserForm1
End Sub
 

Pièces jointes

  • test.xlsm
    21.8 KB · Affichages: 4

Dudu2

XLDnaute Barbatruc
Salut @patricktoulon,
Intéressante analyse que tu fais là...

Quelques remarques:
  1. - Pareil chez moi que chez @ChTi160. L'espace s'agrandit. Mais ça ce sont tes calculs.

  2. - Un détail mais change cette déclaration en retirant l'Alias car ça bug en 64 bits:
    Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongptrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    Utilise plutôt les déclarations et les noms de https://www.cadsharp.com/docs/Win32API_PtrSafe.txt

  3. L'affichage initial modifie en effet des choses pour des raisons que seul Excel connait.
    C'est l'histoire de mon affichage initial qui passe de 12 à 15,75 chez toi et de 12 à 11,40 chez moi.
    Donc ce n'est jamais exactement ce qu'on définit.
    J'avais remarqué autrefois que sur des ListBox ou ComboBox, Excel modifiait les hauteurs tout seul en fonction de la taille de Font, ce qui finalement assez est normal. Peut-être est-ce aussi la raison pour ces Labels témoins.

  4. Sur le post suivant que je vais créer, je vais ajuster tes calculs...
 

patricktoulon

XLDnaute Barbatruc
re
et je pense avoir trouvé (TOUJOURS DANS LA MÊME LOGIQUE)le moyen de faire plus précis

1° j'ajoute une frame dynamiquement
2° je la paramètre sans titre et quelle remplisse l’intérieur du userform
3° 2 getwindowrect (userform et frame)
4° CeY=la différence de top entre les deux RECT pour replacer le userform à l’écran pour pas le voir sursauter
4° suppression de la barre de titre
5 redimensionnement du reste du userform a la taille du rect de la frame converti en points
6° suppression de la frame

on est toujours dans la logique que je défend depuis le début à savoir au final le userform mesure son inside
je l'ai presque fini
j'ai encore des soucis de bordure fine qui me bousille les calculs
 

Dudu2

XLDnaute Barbatruc
Avant de regarder tes RECT, voici ton fichier avec mes calculs de redimensionnement par différence des Insides.

Ce qui apparait, et je l'avais déjà remarqué, c'est que ce redimensionnement ajoute une micro marge en haut, en bas, à gauche et à droite (environ 1 point). J'avais alors envisagé de l'enlever (arbitrairement -1 point) mais pour retomber sur un UserForm identique à l'original au rajout de l'entête, il fallait conserver cette micro marge.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Micro marge en haut, en bas, à gauche et à droite en redimensionnement:


Rajout de l'entête:


Les chiffres montrent que le rajout de l'entête reproduit exactement le UserForm original:
 

Pièces jointes

  • Redimensionner un UserForm sans le Caption (barre du menu système).xlsm
    45.8 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
c'est pas tout a fait exacte a gauche et en top
mais c'est acceptable


vue agrandie gauche et top



et voici a nouveau le fichier avec la methode rectangle en feuille 2
je n'ai pas mis les modif que tu a faite dans la version userform1
je regarde ce que tu a fait et reviens
 

Pièces jointes

  • test.xlsm
    60.2 KB · Affichages: 2

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…