powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Подвинуть программно Shape на один пиксель.
9 сообщений из 9, страница 1 из 1
Excel. Подвинуть программно Shape на один пиксель.
    #38742653
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Excel работает не с пикселями, а с поинтами.
Для стандартного системного масштаба виндовс (96 точек на дюйм) один пиксель равен 0,75 поинта.
Как мне узнать эту переменную у юзера, я ж не могу знать его масштаб.
Средствами VBA и без WinAPI (GetSystemMetrics и др.)
Или какой хитростью... Пробовал сделать скрытый Shape 100х100 пикселей, расположенный 100 пикс. слева и сверху, логики при считывания нового положения после изменения масштаба не выловил. Он и по пикселям сместился, и размер поинта изменился, да всё это ещё и стало неодинаково по горизонтали и вертикали.

Нужно подвинуть Shape на один пиксель на экране.
Подойдет любой легальный способ Excel'я.
Может, в свойствах Application есть какое свойство? А то Application.InchesToPoints, например, не меняется, а я было обрадовался.
Спасибо.
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38742655
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Офис 2003.
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38743375
Guest v.22,

1) почему нельзя пользоваться WinAPI?

2) И WMI - тоже нельзя?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Sub Test()
 Dim WMI As Object
 Dim Monitors As Object
 Dim Monitor As Object
 Set WMI = GetObject("winMgmts:")
 Set Monitors = WMI.ExecQuery("SELECT * FROM Win32_DesktopMonitor") ' WHERE DeviceID='DesktopMonitor1'")
 For Each Monitor In Monitors
    MsgBox Monitor.PixelsPerXLogicalInch & " x " & Monitor.PixelsPerYLogicalInch & _
           " точек на дюйм", vbInformation, _
           "Логическое разрешение для монитора " & Monitor.Name
 Next
End Sub



3) В дюйме - 72 типографских пункта (point).
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38743944
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасип.

1) Случались у меня проблемы с написанными winapi на 64 битных виндовс в 64 битных офисах.
Там немало надо городить для совместимости, в общем-то для простейшей задачи.
Поэтому не хочется.

2) Боюсь, что WMI тоже нельзя. Вот это "Win 32 _DesktopMonitor" у меня тоже вызывает опасения по поводу совместимости. Что запустится везде нормально, а не запустит юзеру дебаггер.
... Хочется средствами екселя как-то.

3) Ну, теперь-то стало понятно, что это величина от экрана не зависит.

... Для стандартного системного масштаба виндовс (96 точек на дюйм) один пиксель равен 0,75 поинта.
Для системного масштаба виндовс 120 точек на дюйм один пиксель равен 0,60 поинта.
Это видно при записи макроса процесса сдвигания объекта.
Но как эту цифру выловить?! Сам же ексель её знает, что хорошо видно при записи макроса.
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38743976
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и с WMI есть небольшая засада ещё: соответствующая служба (инструментарий виндовс) может быть у клиента отключена (((
В нашем большом коллективе сталкивался с такой ситуацией пару раз.
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38744010
Guest v.22,

1) хочется-не хочется, а если задача совместимости стоит, то да, в каких-то местах удвоения кода не избежать. Хорошо ещё, совместимость с 16-битными системами не требуется. И ИМХО, это лучший вариант.

3) 72 [пункт/дюйм] ? 96 [пиксел/дюйм] = 0,75 [пункт/пиксел]
72 [пункт/дюйм] ? 120 [пиксел/дюйм] = 0,6 [пункт/пиксел]
Какое арифметическое действие скрывается за знаком вопроса?
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38744173
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал,

3)
Хорошо, но тогда другой вопрос - как выловить 120 точек на дюйм?
Я ж с этого и начал: не могу узнать системный масштаб юзера легальным способом.
А уж дальше я поделю! :-)
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38744353
Guest v.22,

я бы воспользовался API, хотя бы потому, что код можно использовать не только в Excel:
Код: vbnet
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.
Private Enum BOOL
   FALSE_BOOL
   TRUE_BOOL
End Enum

Private Enum DeviceCapabilities
   HORZSIZE = 4           '  Horizontal size in millimeters
   VERTSIZE = 6           '  Vertical size in millimeters
   HORZRES = 8            '  Horizontal width in pixels
   VERTRES = 10           '  Vertical width in pixels
   LOGPIXELSX = 88        '  Logical pixels/inch in X
   LOGPIXELSY = 90        '  Logical pixels/inch in Y
End Enum

#If VBA7 Then
   Private Declare PtrSafe Function CreateIC Lib "gdi32" Alias "CreateICA" ( _
      ByVal lpDriverName As String, ByVal lpDeviceName As String, _
      ByVal lpOutput As String, ByVal lpInitData As String) As LongPtr
   Private Declare PtrSafe Function DeleteDC Lib "gdi32" (ByVal hDC As LongPtr) As BOOL
   
   Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" ( _
      ByVal hDC As LongPtr, ByVal nIndex As DeviceCapabilities) As Long
#Else
   Private Declare Function CreateIC Lib "gdi32" Alias "CreateICA" ( _
      ByVal lpDriverName As String, ByVal lpDeviceName As String, _
      ByVal lpOutput As String, ByVal lpInitData As String) As Long
   Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As BOOL

   Private Declare Function GetDeviceCaps Lib "gdi32" ( _
      ByVal hDC As Long, ByVal nIndex As DeviceCapabilities) As Long
#End If

Private Const POINTS_PER_INCH = 72

Public Function PointsPerPixelX() As Double
 #If VBA7 Then
    Dim hicDisplay As LongPtr
 #Else
    Dim hicDisplay As Long
 #End If
 hicDisplay = CreateIC("DISPLAY", vbNullString, vbNullString, vbNullString)
 PointsPerPixelX = POINTS_PER_INCH / GetDeviceCaps(hicDisplay, LOGPIXELSX)
 DeleteDC hicDisplay
End Function

Public Function PointsPerPixelY() As Double
 #If VBA7 Then
    Dim hicDisplay As LongPtr
 #Else
    Dim hicDisplay As Long
 #End If
 hicDisplay = CreateIC("DISPLAY", vbNullString, vbNullString, vbNullString)
 PointsPerPixelY = POINTS_PER_INCH / GetDeviceCaps(hicDisplay, LOGPIXELSY)
 DeleteDC hicDisplay
End Function



Не проверял в MS Office 2010 и выше, и в 64-битных системах, но с виду должно работать.
...
Рейтинг: 0 / 0
Excel. Подвинуть программно Shape на один пиксель.
    #38744828
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, видимо, придется через winapi, по-другому никак не достучаться.
Спасибо за готовый рабочий пример.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Подвинуть программно Shape на один пиксель.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]