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 !
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
et ben mon ami à tu changé ton coeff pixel
j'avais la flemme de le faire avec les api 0.6 a la place de 0.75
par ce que là c'est plus que incohérent ton truc
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 .
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
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.
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
Salut @patricktoulon,
Intéressante analyse que tu fais là...
Quelques remarques:
- Pareil chez moi que chez @ChTi160. L'espace s'agrandit. Mais ça ce sont tes calculs.
- 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
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.
Sur le post suivant que je vais créer, je vais ajuster tes calculs...
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
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.
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