Lỗi hiển thị Userform trên các máy tính khác nhau - liên quan tới Screen Scaling

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Letuanh2503

Thành viên mới
Tham gia
12/10/21
Bài viết
8
Được thích
0
Em chào admin và các anh chị. Hiện tại em đang gặp vấn đề về Userform như sau:

1. Em có 1 Userform được tạo trên Desktop với đặc điểm: 1920*1080, Desktop Scaling 100%, 24inch

2. Tuy nhiên khi mở trên Laptop: 1920*1080, Screen Scaling 125% thì Userform hiển thị lỗi.
Em thử thay đổi 125% xuống 100% thì Userform hiển thị đúng size trên Laptop. Nhưng bù lại icon, chữ,.. trên laptop nhỏ quá, rất bất tiện ạ.
  • Vậy có cách nào code VBA khắc phục vấn đề này không ạ? (Code tự thay đổi size Userform dựa trên Screen Scaling)
  • Em tìm đọc cả tối mà chưa tìm được giải pháp, hầu như chỉ có giải pháp cho việc thay đổi Resolution, còn em đang gặp vấn đề với Screen Scaling ạ
  • Em cảm ơn admin và anh chị
 

File đính kèm

  • 1670515386713.png
    1670515386713.png
    259.5 KB · Đọc: 18
PHP:
Option Explicit
'Function to get screen resolution
'https://stackoverflow.com/a/58362904
#If VBA7 Then
    Private Declare PtrSafe Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As LongPtr) As Long
    'Functions to get DPI
    Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hDC As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As Long
#Else
    Private Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
    'Functions to get DPI
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long
#End If
Private Const LOGPIXELSX = 88        'Pixels/inch in X
Private Const POINTS_PER_INCH As Long = 72        'A point is defined as 1/72 inches
'Return DPI
'96 – Smaller 100% | 120 – Medium 125% | 144 – Larger 150% |
'192 – Extra Large 200% | 240 – Custom 250% | 288 – Custom 300% |
'384 – Custom 400% | 480 – Custom 500%
Function lDotsPerInch() As Double
    #If VBA7 Then
        Dim hDC     As LongPtr        ' if VBA7
        Dim hWnd    As LongPtr
    #Else
        Dim hDC     As Long
        Dim hWnd    As Long
    #End If
    hDC = GetDC(0)
    lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    'PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    ReleaseDC 0, hDC
End Function
Private Sub UserForm_Initialize()
    Dim w           As Long, h As Long
    Dim i           As Integer, PointsPerPixel As Double
    PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    w = GetSystemMetrics32(0)        ' Screen Resolution width in points
    h = GetSystemMetrics32(1)        ' Screen Resolution height in points
    Debug.Print "Screen Resolution width" & w & " | " & h & " | " & lDotsPerInch
    With Me
        .StartUpPosition = 2
        .Width = w * PointsPerPixel * 0.5        'Userform width= Width in Resolution * DPI * 50%
        .Height = h * PointsPerPixel * 0.5        'Userform height= Height in Resolution * DPI * 50%
    End With
End Sub
Mình có học lóm và sửa lại được code trên. Bạn đưa vào UserForm chạy thử, điều chỉnh theo ý mình nhé.
1. Hàm lDotsPerInch trả về DPI, giá trị tương ứng là
Mã:
'96 – Smaller 100% | 120 – Medium 125% | 144 – Larger 150% |
'192 – Extra Large 200% | 240 – Custom 250% | 288 – Custom 300% |
'384 – Custom 400% | 480 – Custom 500%
2. Sau khi giá trị % Scale họ quy đổi tiếp về PointsPerPixel tương ứng. Sau đó điều chỉnh kích thước của User Form.
 
Upvote 0
PHP:
Option Explicit
'Function to get screen resolution
'https://stackoverflow.com/a/58362904
#If VBA7 Then
    Private Declare PtrSafe Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As LongPtr) As Long
    'Functions to get DPI
    Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hDC As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As Long
#Else
    Private Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
    'Functions to get DPI
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long
#End If
Private Const LOGPIXELSX = 88        'Pixels/inch in X
Private Const POINTS_PER_INCH As Long = 72        'A point is defined as 1/72 inches
'Return DPI
'96 – Smaller 100% | 120 – Medium 125% | 144 – Larger 150% |
'192 – Extra Large 200% | 240 – Custom 250% | 288 – Custom 300% |
'384 – Custom 400% | 480 – Custom 500%
Function lDotsPerInch() As Double
    #If VBA7 Then
        Dim hDC     As LongPtr        ' if VBA7
        Dim hWnd    As LongPtr
    #Else
        Dim hDC     As Long
        Dim hWnd    As Long
    #End If
    hDC = GetDC(0)
    lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    'PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    ReleaseDC 0, hDC
End Function
Private Sub UserForm_Initialize()
    Dim w           As Long, h As Long
    Dim i           As Integer, PointsPerPixel As Double
    PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    w = GetSystemMetrics32(0)        ' Screen Resolution width in points
    h = GetSystemMetrics32(1)        ' Screen Resolution height in points
    Debug.Print "Screen Resolution width" & w & " | " & h & " | " & lDotsPerInch
    With Me
        .StartUpPosition = 2
        .Width = w * PointsPerPixel * 0.5        'Userform width= Width in Resolution * DPI * 50%
        .Height = h * PointsPerPixel * 0.5        'Userform height= Height in Resolution * DPI * 50%
    End With
End Sub
Mình có học lóm và sửa lại được code trên. Bạn đưa vào UserForm chạy thử, điều chỉnh theo ý mình nhé.
1. Hàm lDotsPerInch trả về DPI, giá trị tương ứng là
Mã:
'96 – Smaller 100% | 120 – Medium 125% | 144 – Larger 150% |
'192 – Extra Large 200% | 240 – Custom 250% | 288 – Custom 300% |
'384 – Custom 400% | 480 – Custom 500%
2. Sau khi giá trị % Scale họ quy đổi tiếp về PointsPerPixel tương ứng. Sau đó điều chỉnh kích thước của User Form.
Dạ, em cảm ơn anh ạ. Vậy giải pháp là điều chỉnh size của Userform để đáp ứng được độ phân giảiscreen scaling tối thiểu anh nhỉ?
 
Upvote 0
Bạn dùng Office 2016 trở lên thì giao diện userform tự phóng to theo phân giải màn hình đấy.
 
Upvote 0
Mình thấy các phần mềm thiết kế họ không lấy 1920 làm tiêu chuẩn độ rộng màn hình mà lấy độ rộng nhỏ hơn để phù hợp với đa số màn hình máy tính khác.
Vấn đề của em không phải vậy anh ạ! Anh đang hiểu sai vấn đề của em rồi. Cảm ơn anh
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom