Autres pointstoScreenPixels X ou Y nous nous Sommes bien cassé la tète pour rien

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
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 :oops:🙃🤓
 

Lu76Fer

XLDnaute Occasionnel
Dans la fonction Pane.PointToScreenXouY le zoom ne doit pas intervenir car il est pris en compte, forte heureusement, déjà par la fonction. Bien-sûr à ne pas confondre avec la fonction Window.PointToScreenXouY que je déconseille d'utiliser car c'est la version buguer qui date de la version Excel 2003.
Il est très difficile de toute façon de calculer l'effet de zoom car il génère des arrondis qui ne permettent pas de tomber sur une valeur exacte ... De toute façon c'est une erreur de faire intervenir le zoom !
VB:
        '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
 

Lu76Fer

XLDnaute Occasionnel
Voici une explication qui ne fait pas intervenir la version de windows mais juste le calcul.
VB:
PosXY(1) = ((PaN.PointsToScreenPixelsX(Int(Cell.Left)) / PtsToPxX) * TheZoom)
'Peut être écrit sous cette forme :
PosXY(1) = (PaN.PointsToScreenPixelsX(Int(Cell.Left)) / PtsToPxX)
PosXY(1) = PosXY(1) * TheZoom
On calculerait la position x sur l'écran et tiendrait compte du zoom de la grille mais du bord gauche de l'écran jusqu'à la grille le zoom n'intervient pas !!
 

patricktoulon

XLDnaute Barbatruc
re je vois pas pourquoi tu réédite mes codes (surtout qu'il sont faux)
le calcul est faux et le pire c'est que tu le dis toi même et tu dis même pourquoi 🤣

alors certes on est pas loin mais c'est faux quand même



PaN.PointsToScreenPixelsX(Int(Cell.Left) contient:
  1. le left de l'application qui n'est pas zoomé par excel
  2. pour W7 la bordure de 3.87 points en thème aeroglass+ombre qui n'est pas zoomée non plus d'ailleurs il n'est pas pris en compte dans le calcul
  3. la colonne de numéro de ligne qui n'est pas zoomée conformément à la valeur du zoom
  4. le left de (cell) qui lui est zoomé
et ce code zoom le tout

quand tu pêche un code regarde si l'auteur n'a pas mis a jour ou fait des corrections
 

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi