patricktoulon
XLDnaute Barbatruc
Bonjour a tous
A L’attention de certain d'entre nous qui on participé il y a quelque temps déjà a l'élaboration d'un principe fiable
pour déterminer une position en points d'une cellules par raport aubords top et gauche de l'ecran afin de placer un userform par exemple
pour n'en citer que quelque un qui avons adopté le même principe et qui ont été le plus participatif
j'ai nommé
@Dranreb mais avec les api pour la conversion point to pixel
@Roland_M quasiment le même principe que moi
et moi même qui gère tout avec pointstoscreenpixels
et bien messieurs nous nous somme bien cassé la tète pour rien
en effet le principe était le pointstoscreenpixels (left de la cellule) + le visible range des panes précédentes si panes.count + de 1 -les scroll etc.... etc...
alors que tout simplement
il fallait utiliser
1° le pointtoscreenpixels de la pane 1 pour le coeff de conversion
2° le pointstoscreenpixels (non pas de l'activepane mais de la pane concernée)
plus de calcul listrow ou listcolumn de l'activewindow
plus de visiblerange .width de l'activewindow plus rien du tout .....
démonstration
un userform "Userform1"
un module avec comme code
fonctionne parfaitement bien en DPI 10(96%) et 120(125%) testé sur 2 écrans bien différents
les problèmes du aux thèmes de Windows n'entre pas en jeux il faut bien sur ajuster de quelques points en fonction de votre System et affichage cela ne change pas
l'erreur était là
on prend le coeef avec le pointstoScreenpixels de la pane(1) impérativement donc la plus a gauche et en haut des panes
et on prend le pointstoScreenpixels de la pane concerné ou désignée
avant on prenait tout de la même et c’était une erreur
A L’attention de certain d'entre nous qui on participé il y a quelque temps déjà a l'élaboration d'un principe fiable
pour déterminer une position en points d'une cellules par raport aubords top et gauche de l'ecran afin de placer un userform par exemple
pour n'en citer que quelque un qui avons adopté le même principe et qui ont été le plus participatif
j'ai nommé
@Dranreb mais avec les api pour la conversion point to pixel
@Roland_M quasiment le même principe que moi
et moi même qui gère tout avec pointstoscreenpixels
et bien messieurs nous nous somme bien cassé la tète pour rien
en effet le principe était le pointstoscreenpixels (left de la cellule) + le visible range des panes précédentes si panes.count + de 1 -les scroll etc.... etc...
alors que tout simplement
il fallait utiliser
1° le pointtoscreenpixels de la pane 1 pour le coeff de conversion
2° le pointstoscreenpixels (non pas de l'activepane mais de la pane concernée)
plus de calcul listrow ou listcolumn de l'activewindow
plus de visiblerange .width de l'activewindow plus rien du tout .....
démonstration
un userform "Userform1"
un module avec comme code
VB:
Sub test()
Dim pos
With UserForm1
pos = GetPointDistanceCellFromTheBorderScreen([E5], 4)
'pos = GetPointDistanceCellFromTheBorderScreen ' sans arguemnt = activepane et activecell( pour les placement dynamique dans des event faeuilles
.StartUpPosition = 0
.Left = pos(1) '+ 4
.Top = pos(2) '+ 4
.Show 0
End With
End Sub
Function GetPointDistanceCellFromTheBorderScreen(Optional Cell As Range = Nothing, Optional IndexPane& = 0)
'récupérer la distance (des bords de l’écran a la cellule désignée)en points théoriques en incluant le freezepane et figés et c....
'version 2.0
'date février 2022
'patricktoulon
'un calcul simplifié
'**********************************************************************************************
Dim PtsToPxX#, PtsToPxy#, TheZoom#, PosXY(1 To 2), PaN As Pane
With ActiveWindow
If IndexPane > .Panes.Count Or IndexPane = 0 Then Set PaN = .ActivePane Else: Set PaN = .Panes(IndexPane)
If Cell Is Nothing Then Set Cell = ActiveCell
'on calcule les coeffs (points to pixel) sur la panes(1) (obligatoire!!!)
PtsToPxX = ((.Panes(1).PointsToScreenPixelsX(72) - .Panes(1).PointsToScreenPixelsX(0)) / 72) 'défini le coeff point to pixel horizontal
PtsToPxy = ((.Panes(1).PointsToScreenPixelsY(96) - .Panes(1).PointsToScreenPixelsY(0)) / 96) 'défini le coeff point to pixel vertical
'défini le coeff zoom
TheZoom = .Zoom / 100
'on récupère le PointsToScreenPixels( X et Y) sur la pane concernée
PosXY(1) = ((PaN.PointsToScreenPixelsX(Int(Cell.Left)) / PtsToPxX) * TheZoom) 'left en point
PosXY(2) = ((PaN.PointsToScreenPixelsY(Int(Cell.Top)) / PtsToPxy) * TheZoom) 'top en point
End With
GetPointDistanceCellFromTheBorderScreen = PosXY
End Function
fonctionne parfaitement bien en DPI 10(96%) et 120(125%) testé sur 2 écrans bien différents
les problèmes du aux thèmes de Windows n'entre pas en jeux il faut bien sur ajuster de quelques points en fonction de votre System et affichage cela ne change pas
l'erreur était là
on prend le coeef avec le pointstoScreenpixels de la pane(1) impérativement donc la plus a gauche et en haut des panes
et on prend le pointstoScreenpixels de la pane concerné ou désignée
avant on prenait tout de la même et c’était une erreur