Const VerticalScrollBarBordersPixels As Long = 2 * 2.5 'Borders around the Vertical Scroll Bar
Const HorizontalScrollBarBordersPixels As Long = 2 * 4 'Borders around the Horizontal Scroll Bar
Const StatusBarHeightPixels = 26
#If VBA7 Then
Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare PtrSafe Function GetSystemMetricsForDpi Lib "user32" (ByVal nIdx As Long, ByVal lDPI As Long) As Long
Private Declare PtrSafe Function GetDpiForWindow Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
#Else
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function GetSystemMetricsForDpi Lib "user32" (ByVal nIdx As Long, ByVal lDPI As Long) As Long
Private Declare Function GetDpiForWindow Lib "user32" (ByVal hWnd As Long) As Long
#End If
Private Const SM_CXVSCROLL = 2
Private Const SM_CYHSCROLL = 3
Private Const SM_CXDLGFRAME = 7
Private Const SM_CYDLGFRAME = 8
Private Const SM_CXSIZEFRAME = 32
Sub test2()
MsgBox "Dpi simulé pour la fenêtre par Windows : " & GetDpiForWindow(Application.hWnd)
MsgBox "largeur de scrollbar :" & GetSystemMetricsForDpi(SM_CXVSCROLL, GetDpiForWindow(Application.hWnd))
MsgBox " Largeur des bordures avec DPI full :" & GetSystemMetricsForDpi(SM_CXSIZEFRAME, GetDpiForWindow(Application.hWnd))
MsgBox " Largeur des bordures sans DPI full :" & GetSystemMetrics(SM_CXSIZEFRAME)
End Sub
Sub test3()
MsgBox " ptopx :" & PointsToPixel & vbCrLf & "soit l'inverse :" & 1 / PointsToPixel
End Sub
Function PointsToPixel()
PointsToPixel = GetDpiForWindow(Application.hWnd) / 72
End Function
Oui, pour moi aussi.C'est trop compliqué pour moi.
Belle trouvaille ! Ça me plait bien car API et peu de code !GetDpiForWindow(
#If VBA7 Then
Private Declare PtrSafe Function GetDpiForWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function GetDpiForWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If
Function PointToPixel() As Double
With Application
PointToPixel = GetDpiForWindow(.hwnd) / .InchesToPoints(1)
End With
End Function
Function PixelToPoint() As Double
PixelToPoint = 1 / PointToPixel
End Function
With RVR
.Left = Window.VisibleRange.Left * PointToPixel / Zoom
.Right = .Left _
+ (RW.Right - RW.Left) / Zoom _
+ VerticalBorderWidth _
- GetVerticalHeadingsWidthPixels(Window) _
- IIf(Not Window.WindowState = xlMaximized, RightFrameWidth, 0) _
- IIf(Application.DisplayScrollBars, VerticalScrollBarWidth, 0)
.Top = Window.VisibleRange.Top * PointToPixel / Zoom
.Bottom = .Top _
+ (RW.Bottom - RW.Top) / Zoom _
- GetRibbonAndHorizontalHeadingsHeightPixels(Window) _
- IIf(Not Window.WindowState = xlMaximized, BottomFrameWidth, 0) _
- IIf(Application.DisplayScrollBars, HorizontalScrollBarHeight, 0) _
- IIf(Application.DisplayStatusBar, StatusBarHeight, 0)
End With
Avec plaisir.@TooFatBoy, tu peux essayer STP ?
Pour #20, c'était :
Je n'ai touché à rien, j'ai juste testé tes classeurs.Faut pas que tu lui fasses retourner un LongPtr, incompatibilité de type. Un Long ça va mieux.
C'est pour @patricktoulon dans le code de son fichier du Post #36.Je n'ai touché à rien, j'ai juste testé tes classeurs.
Ah bon. Au temps pour moi alors.C'est pour @patricktoulon dans le code de son fichier du Post #36.
Avec #42 : un "tout petit" pixel trop haut... autrement dit, précédemment ça devait être deux pixels trop haut et non un seul.Je pense que ça ira chez vous, mais ça ne va pas chez moi en fenêtre réduite car l'ajout de la BORDER qui devrait régler le problème chez vous, me fait dépasser les limites.