XL 2016 dimensions minimum d'un userform (Résolu)

LEMLEM

XLDnaute Nouveau
Bonjour à Tous
Je voulais utiliser un userform à la place d'un controltiptext. J'ai donc supprimé le bandeau et réduit sa taille.
Sauf qu'il est impossible d'aller en dessous d'une certaine valeur.
Quelqu'un a-t-il une idée pour comment aller plus bas dans les dimensions?
Ci-joint le bout de code
 

Pièces jointes

  • USF_AS_CONTROLTIPTEXT.xlsm
    21 KB · Affichages: 7
Solution
Bonjour,
Encore merci pour votre contribution.
Je me suis inspiré de votre proposition en introduisant l'API SetWindowPos.
et aussi le rapport Point / Pixel
Je suis, donc, arrivé au résultat que je voulais. (Voir Fichier joint).
Pour moi c'est Résolu. Je ne sais pas où le déclarer.

PS: pour l'Horloge j'ai utilisé les fonction SetTimer et KillTimer de "USER32"

LEMLEM

XLDnaute Nouveau
bonjour
essaie donc le mien voir
Salut Pat,
Merci pour ta proposition. Mais ce n'est pas exactement ce à quoi je veux aboutir. je l'ai bien étudié, ça reste un peu opaque pour moi, surtout ces "JCC", "JJJJ" etc...
L'idée est d'avoir les dimensions des controltiptext.
En fait je voulais inclure une horloge (du style "HH MM SS") à l'interieur d'un TipText et comme je n'ai pas réussi. j'ai pensé à manipuler un userform. J'y arrive sauf que mon userform ne veut pas aller plus bas que je le souhaite.
 

LEMLEM

XLDnaute Nouveau
Bonjour,
Encore merci pour votre contribution.
Je me suis inspiré de votre proposition en introduisant l'API SetWindowPos.
et aussi le rapport Point / Pixel
Je suis, donc, arrivé au résultat que je voulais. (Voir Fichier joint).
Pour moi c'est Résolu. Je ne sais pas où le déclarer.

PS: pour l'Horloge j'ai utilisé les fonction SetTimer et KillTimer de "USER32"
 

Pièces jointes

  • USF_AS_CONTROLTIPTEXT(Final).xlsm
    28.8 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
re
1° decouper la cadre
2° pour ensuite decouper à nouveau avec setwindowpos
3° l'api set timer implique que ton userform est tributaire d'un module standard l'addreoof ne fonctionne pas dans les module classe
4° le 0.75 c'est pas toujours valable en fait ca depend de tes paramètres
5° je fait la même chose en 3 lignes dans le activate avec getactivewindow , createroundrect ,setwindowrgn
allez 2 de plus histoire d'avoir le coeef point/pixel si les coordonnées doivent etre une cellule bien sur
 

patricktoulon

XLDnaute Barbatruc
tiens en plus je te met l'horloge
dans le userform
VB:
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As LongPtr
Private Declare PtrSafe Function SetWindowRgn Lib "user32" (ByVal hWnd As LongPtr, ByVal hRgn As LongPtr, ByVal bRedraw As Long) As Long
Dim clock As Boolean

Private Sub Label1_Click(): clock = False: Unload Me: End Sub

Private Sub UserForm_Activate()
Dim RectLong As LongPtr, PtoPx#
With ActiveWindow.Panes(1)
PtoPx = 1 / ((.PointsToScreenPixelsX(7200) - .PointsToScreenPixelsX(0)) / 7200)
SetWindowRgn GetActiveWindow, CreateRoundRectRgn(0, 25, LblW * PtoPx, 26 + LblH * PtoPx, 0, 0), 1
Move .PointsToScreenPixelsX([f6].Left) * PtoPx, -20 + .PointsToScreenPixelsY([f6].Top) * PtoPx
End With
clock = True: Startclock
End Sub

Sub Startclock(): Do While clock = True: DoEvents: Label1 = Time: Loop: End Sub
et je le place précisément dans une cellule
tu constatera que je le decoupe en une seule ligne
voila comment il est au depart
1701383403622.png


et voila le résultat
comme tu vois la montre tourne et ça ne m'empêche pas de travailler dans les cellules
demo.gif


tu clique dessus pour le fermer
 

LEMLEM

XLDnaute Nouveau
tiens en plus je te met l'horloge
dans le userform
VB:
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As LongPtr
Private Declare PtrSafe Function SetWindowRgn Lib "user32" (ByVal hWnd As LongPtr, ByVal hRgn As LongPtr, ByVal bRedraw As Long) As Long
Dim clock As Boolean

Private Sub Label1_Click(): clock = False: Unload Me: End Sub

Private Sub UserForm_Activate()
Dim RectLong As LongPtr, PtoPx#
With ActiveWindow.Panes(1)
PtoPx = 1 / ((.PointsToScreenPixelsX(7200) - .PointsToScreenPixelsX(0)) / 7200)
SetWindowRgn GetActiveWindow, CreateRoundRectRgn(0, 25, LblW * PtoPx, 26 + LblH * PtoPx, 0, 0), 1
Move .PointsToScreenPixelsX([f6].Left) * PtoPx, -20 + .PointsToScreenPixelsY([f6].Top) * PtoPx
End With
clock = True: Startclock
End Sub

Sub Startclock(): Do While clock = True: DoEvents: Label1 = Time: Loop: End Sub
et je le place précisément dans une cellule
tu constatera que je le decoupe en une seule ligne
voila comment il est au depart
Regarde la pièce jointe 1185100

et voila le résultat
comme tu vois la montre tourne et ça ne m'empêche pas de travailler dans les cellules
Regarde la pièce jointe 1185101

tu clique dessus pour le fermer
Bonjour,
J'apprecie beaucoup ton approche et de plus elle est très épurée.
Pour le 0.75, je sais c'était juste pour aller vite.
J'ai intégré ton idée dans mon projet, mais je garde SetTimer pour des raisons d'économie de ressources.
ci-joint le fichier légérement corrigé pour aller avec la résolution ( 1366x768) de mon laptop (HP i7)
 

Pièces jointes

  • USF_AS_CONTROLTIPTEXT(Final-Bis).xlsm
    32.4 KB · Affichages: 1

Discussions similaires