Пиксели, поинты, твипы и 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д