Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/41: Рейтинг темы: голосов - 41, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
1

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

28.07.2012, 22:01. Показов 8188. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые коллеги! Помогите разобраться с пикселями, поинтами, твипами и 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 в зависимости от размеров дисплея? Заранее благодарен! Сегодня началась Олимпиада, а я из-за этой проблемы вообще ничего не посмотрел - искал не поднимая головы!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2012, 22:01
Ответы с готовыми решениями:

Как перевести твипы в пиксели?
как перевести твипы в пикселы???

Bitmap объект при сохранении в файл не сохраняет новое значение DPI - пиксели на дюйм
Коллеги, подскажите новичку: Bitmap bmp = new Bitmap(@"d:\rr0\rr.jpg"); ...

(пиксели окна != пиксели монитора) ?
HDC hDCScreen = GetDC(NULL); int Horres = GetDeviceCaps(hDCScreen, HORZRES); int Vertres =...

Параметр DPI
В требованиях девайса к ПК, кроме всего-прочего есть и такое: Screen resolution 1024 x 768 or 1280...

15
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
29.07.2012, 08:13  [ТС] 2
Мне нужно не по центру, а внизу. Это во-первых, а во-вторых, почему Top=2*Top, а не умноженное на 3 или 4?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
29.07.2012, 09:02 3
Лучший ответ Сообщение было отмечено как решение

Решение

Насколько мне известно, все API-функции работают только с пискелами. 1024*768 - это размер экрана в пикселах.

"рисую форму на домашнем НЕТБУКе (1024х600) внизу экрана, дабы закрыть от пользователя нижнее Window'ое меню с кнопкой пуск и вкладку Excel'я с листами" - а зачем это нужно (закрывать от пользователя пусковую панель)? Пользователь может ведь перетянуть ее мышью в правую или левую вертикаль экрана...
3
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
29.07.2012, 09:20  [ТС] 4
Можно заблокировать перемещение формы пользователем. Внизу будет меню кнопок: "Добавить запись","Редактировать запись","Удалить запись" и "Выход"

Добавлено через 10 минут
Может быть выложить программу?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
29.07.2012, 09:24 5
Цитата Сообщение от carpenter Посмотреть сообщение
Можно заблокировать перемещение формы пользователем.
- лишние блокировки раздражают...
2
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
29.07.2012, 15:52 6
Лучший ответ Сообщение было отмечено как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
'перевод твипов в пиксели
Public Function TwipToPixel(ByVal Twips As Long) As Long
  TwipToPixel = Twips / TwipsPerPixel()
End Function
 
'перевод пикселей в твипы
Public Function PixelToTwip(ByVal Pixels As Long) As Long
  PixelToTwip = Pixels * TwipsPerPixel()
End Function
Дополнительные пользовательские функции и АПИ
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    Width As Long
    Height As Long
End Type
 
Public Const LOGPIXELSX As Long = 88
Public Const LOGPIXELSY As Long = 90
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
 
 
Sub inUse() '
      Debug.Print GetWindowRectSize(Application.hWndAccessApp).Height
End Sub
 
'=================================================================================
Public Function GetWindowRectSize(hwnWindow, Optional inpx As Boolean) As RECT
'Для визначення розмірів вікон
    Dim a As Long
        a = GetWindowRect(hwnWindow, GetWindowRectSize)
        With GetWindowRectSize
            .Height = .Right - .Left
            .Width = .Bottom - .Top
        
            If Not inpx Then
                .Left = PixelToTwip(.Left)
                .Top = PixelToTwip(.Top)
                .Right = PixelToTwip(.Right)
                .Bottom = PixelToTwip(.Bottom)
                .Width = PixelToTwip(.Width)
                .Height = PixelToTwip(.Height)
            End If
        End With
End Function
 
Private Function TwipsPerPixel(Optional ByVal Dimension As Long = LOGPIXELSX) As Long
  Const TwipsPerInch As Long = 1440
  Dim DesktopDC As Long
On Error GoTo ErrorHandle
  DesktopDC = GetDC(Application.hWndAccessApp) 'DesktopDC = GetDC(HWND_DESKTOP)
  TwipsPerPixel = TwipsPerInch / GetDeviceCaps(DesktopDC, Dimension)
ErrorHandle:
  Call ReleaseDC(Application.hWndAccessApp, DesktopDC) 'Call ReleaseDC(HWND_DESKTOP, DesktopDC)
  'Call Exception.RaiseAgain
End Function
hWndAccessApp - hwnd окна. В примере окна Access
5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
29.07.2012, 22:54 7
Лучший ответ Сообщение было отмечено как решение

Решение

Почитайте мою статью Прогресс-бар в статус-баре. Там и о метриках есть...
3
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
29.07.2012, 23:46  [ТС] 8
Для форумчанина MOBILE: Прошу прощения за мою безграмотность в вопросах API-функций, если Вас не затруднит, Вы не пояснили бы свой ответ: Что куда всталять? (куда раскидать какие функции (какие в модули, какие в UserForm и т.д.). Чувствую, что истина кроется в Вашем ответе! Заранее благодарен. С Уважением, Carpenter.
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
30.07.2012, 01:41 9
Catstail, а в каком виде у Вас упомянутая в статье "Библия API" Д.Эпплмана? в бумажном?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
30.07.2012, 09:16 10
Да, в бумажном. Это толстенная книга страниц на 900...
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
30.07.2012, 10:43 11
жаль что в бумажном, а не что 900.
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
30.07.2012, 23:35  [ТС] 12
С Уважением, Carpenter.
_________________________________________________
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
Все надо расположить модуле UserForm
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
31.07.2012, 00:00 13
carpenter, я не очень понял ваши вопросы. Даю пример - файл екселя. При открытии в нем сообщаются ширина, высота и рассточние от верхнего края в твипах и пикселах. Если окно екселя смещать вверх/вниз, то высвечиваемые параметры окна будут меняться. "Последовательным приближением" получите нужное положение
Вложения
Тип файла: zip PixelTwip.zip (14.8 Кб, 38 просмотров)
1
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
31.07.2012, 00:19  [ТС] 14
Mobile, честно говоря, я когда-то был программёром. Писал на досовском Fox'e. Вроде бы, даже неплохо. Но это уже позапрошлый век!!! Вот решил САМ попробовать свои силы на VBA. А поскольку я только в начале этого пути, я иду наощупь, как слепой Пью! И вопросы мои, наверняка, "корявые" и набиваю шишки. Я сам с трудом представляю как всё должно выглядеть, оттуда все мои "шараханья из стороны в сторону"! В любом случае, СПАСИБО!!! Приятно, когда тебя не бросают на произвол судьбы! Завтра обязатель гляну Ваш пример. Ещё раз Спасибо!
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
31.07.2012, 01:21 15
Ошибка вкралась в пример. Поправил и немного изменил интефейс
Вложения
Тип файла: zip PixelTwip.zip (15.8 Кб, 105 просмотров)
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 8
31.07.2012, 10:16  [ТС] 16
Спасибо! Теперь всё стало понятно! Сейчас буду применять Вашу методу! Что "налопачу" - покажу (если, конечно, таким "зубрам" в VBA, каким наверняка Вы являетесь, будет интересно). Интернет, всё-таки, великая вещь: можно пообщаться с умными людьми невыходя из дома!
0
31.07.2012, 10:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 10:16
Помогаю со студенческими работами здесь

X7 - DPI ( Mouse)
Сообственно интересует переключениие ( горящих лампочек на мышке х7 - У кого она есть тот знает :)...

Поворот с dpi
Здравствуйте. Скажите пожалуйста, как можно повернуть окно программы с помощью механизма dpi на qt....

DPI в эмуляторе
Использую Genymotion на Linux. Тут решил кастомное разрешение установить, заодно поигрался с DPI. В...

Самопроизвольно переключается DPI
На проводной мышке самопроизвольно переключается DPI. Чаще во время игры, но также и при типичном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru