Пиксели, поинты, твипы и DPI! - VBA

Узнай цену своей работы

Формулировка задачи:

Уважаемые коллеги! Помогите разобраться с пикселями, поинтами, твипами и DPI! Третьи сутки "лопачу" инет, а ясности в этом вопросе как не было, так и нет! Наооборот, только ещё больше запутался! Функцией Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long вытащил GetDeviceCaps(hDC, HORZRES)=1024, a GetDeviceCaps(hDC, VERTRES)=768! Это размеры дисплея? Но в каких единицах измерения выдаваемые числа?! Пиксели?! Поинты?! Твипы?! DPI?! В каких единицах измерения задаются UserForm1.Top, UserForm1.Left, UserForm1.Height, UserForm1.Width?! Каким образом связаны размер дисплея с UserForm1.Top?! Как все эти понятия (пиксели, поинты, твипы и DPI) связаны друг с другом? А суть такова: рисую форму на домашнем НЕТБУКе (1024х600) внизу экрана, дабы закрыть от пользователя нижнее Window'ое меню с кнопкой пуск и вкладку Excel'я с листами, на рабочем компе (1024х768) форма "всплывает" вверх! Как программно расчитать UserForm1.Top в зависимости от размеров дисплея? Заранее благодарен! Сегодня началась Олимпиада, а я из-за этой проблемы вообще ничего не посмотрел - искал не поднимая головы!

Решение задачи: «Пиксели, поинты, твипы и DPI!»

textual
Листинг программы
Private Declare Function ShowWindow& Lib _
        "user32" (ByVal q&, ByVal q1&)
        
Private Declare Function SetWindowPos Lib _
    "user32" (ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long, _
     ByVal x As Long, ByVal y As Long, _
     ByVal cx As Long, ByVal cy As Long, _
     ByVal wFlags As Long) As Long
     
Private Declare Function FindWindow Lib _
    "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
    
Const SWP_HIDEWINDOW = &H80
Const SWP_SHOWWINDOW = &H40
Dim hPanel As Long
Dim p As Long
 
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal hDC As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" ( _
    ByVal hDC As Long, _
    ByVal nIndex As Long) As Long
 
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Const TWIPSPERINCH = 1440
 
Private Declare Function GetSystemMetrics Lib "user32" ( _
    ByVal nIndex As Long) As Long
 
Private Const SM_CXFULLSCREEN = 16
Private Const SM_CYFULLSCREEN = 17
 
Sub ConvertPixelsToPoints(ByRef x As Single, ByRef y As Single)
    Dim hDC As Long
    Dim RetVal As Long
    Dim XPixelsPerInch As Long
    Dim YPixelsPerInch As Long
 
    hDC = GetDC(0)
    XPixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    YPixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSY)
    RetVal = ReleaseDC(0, hDC)
    x = x * TWIPSPERINCH / 20 / XPixelsPerInch
    y = y * TWIPSPERINCH / 20 / YPixelsPerInch
End Sub
 
Sub Move()
    Dim Wt As Single
    Dim Ht As Single
Stop
    Wt = GetSystemMetrics(SM_CXFULLSCREEN)
    Ht = GetSystemMetrics(SM_CYFULLSCREEN)
    With UserForm1
        ConvertPixelsToPoints Wt, Ht
        .Left = Wt - .Width
        .Top = Ht - .Height  ' 1-ый вариант (выше)
        .Top = Ht               ' 2-ой вариант (ниже)
        .Show vbModeless
    End With
    
End Sub
 
Private Sub UserForm_Initialize()
    Call Move
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы