1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Public Function RenvoieCoordEcran(Ctrl As Control, Optional PrendEnCpteHauteur As Boolean = True) As Double()
'Cette fonction renvoie les coordonnées du pixel située en haut et à gauche du contrôle Ctrl.
'Elle renvoie un tableau contenant en premier indice l'abscisse (x), en deuxième l'ordonnée (y), et en troisième l'abscisse correspondant à l'extrémité droite du contrôle.
'Si PrendEnCpteHauteur est Vrai, alors l'ordonnée sera celle du coin inférieur gauche du contrôle.
Dim DimCtrl As RECT, XX As Long, YY As Long, ZZ As Long, YiN As Long, HdC As Long, EpS As Long, lpppX As Long, lpppy As Long
Dim Coords(2) As Double
ReDim RenvoieCoordEcran(1)
HdC = GetDC(0): lpppX = GetDeviceCaps(HdC, LOGPIXELSX): lpppy = GetDeviceCaps(HdC, LOGPIXELSY)
GetWindowRect GetActiveWindow, DimCtrl ' coordonnées rectangle de l'userform
With Ctrl
XX = .Left * lpppX / 72 'Position Gauche du contrôle cliqué en pixel
YY = (.Top + IIf(PrendEnCpteHauteur, .Height, 0)) * lpppy / 72 'Position Haut du contrôle cliqué en pixel
ZZ = (.Left + .Width) * lpppX / 72 'Position du bord droit du contrôle
'les api c'est bien sauf que pour W7 il faut prendre en compte l'aero qui modifie encore la chose
'en effet selon les versions de W (xp,7,8,10)getsystemmetric donne pareil sauf qu'en réalité ca ne l'ai pas
'YiN = (.Parent.Height - .Parent.InsideHeight - 3) * lpppy / 72 'Epaisseur de la caption du userform en pixel 3 c'est arbitraire
'EpS = GetSystemMetrics(5) 'Epaisseur des bordures de l' userform en pixel
YiN = (.Parent.Height - .Parent.InsideHeight - ((.Parent.Width - .Parent.InsideWidth))) * lpppy / 72 'Epaisseur de la caption du userform en pixel
EpS = (.Parent.Width - .Parent.InsideWidth) 'Epaisseur des bordures de l' userform en pixel'on ne divise pas par 2 la logique pourtant le voudrait!!!
'eps donnera pas la meme chose selon le windows(xp,7,8,10)
Coords(0) = DimCtrl.Left + EpS + XX
Coords(1) = DimCtrl.Top + YiN + EpS + YY
Coords(2) = DimCtrl.Left + EpS + ZZ
End With
RenvoieCoordEcran = Coords
End Function |
Partager