Автор Тема: Создание GUI с учетом установленного масштабирования  (Прочитано 476 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем привет.

Столкнулся с такой задачкой. Если в системе Windows 10 установлено масштабирование отличное от 100%, в разделе настроек «массштаб и разметка», то все, создаваемые скриптом окна игнорируют этот параметр, остаются мелкими, в сравнении с общим интерфейсом, а вот текст в окнах создается с учетом этого массштаба, а потому ломает весь дизайн окна. Можете себе представить это? Текст просто не вмещается в элементы окна. Есть ли способ это решить как-то? Может кто-то сталкивался с подобным...


Такая проблема не на всех компьютерах возникает. Наверное видеодрайвер, в паре с монитором, за это отвечают.
« Последнее редактирование: Декабрь 06, 2017, 10:03:28 от musicstashall »

Русское сообщество AutoIt


Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3651
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
; сообщаем системе, что мы умеем масштабировать интерфейс
DllCall("User32.dll", "bool", "SetProcessDPIAware")

; рассчитываем коэффициент масштабирования
$Zoom = RegRead("HKCU\Control Panel\Desktop\WindowMetrics", "AppliedDPI") / 96
If @error Or $Zoom < 1 Then $Zoom = 1

; учитываем масштаб в GUI
GUICreate("Zoom", 230 * $Zoom, 100 * $Zoom)
GUICtrlCreateButton("Текст кнопки", 10 * $Zoom, 10 * $Zoom, 80 * $Zoom, 30 * $Zoom)
GUICtrlCreateInput("  Текст в поле ввода", 100 * $Zoom, 10 * $Zoom, 120 * $Zoom, 20 * $Zoom)
GUISetState()
Do
Until GUIGetMsg() = -3


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Это всё замечательно, не думал даже, что есть решение. Но как быть в тех случаях, когда окна сами создаются с учетом масштабирования? Если мы принудительно к этому зададим коэффициент, то у нас другая крайность возникнет. Вот, на ноутбуке у меня окна создаются с правильным массштабом, а на ПК массштаб игнорируется — там маленькие окна получаются. Как этот момент учитывать?
Или этот вызов
Код: AutoIt [Выделить]
DllCall("User32.dll", "bool", "SetProcessDPIAware")

как раз и сообщает системе, что мы сами будем масштабировать?

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3651
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Тема масштабирования в Windows обширна, сложна и запутана. Изучайте теорию, проверяйте её на практике и побольше экспериментируйте. Если, конечно, оно вам надо.

Русское сообщество AutoIt

Re: Создание GUI с учетом установленного масштабирования
« Ответ #3 Отправлен: Декабрь 06, 2017, 14:30:11 »

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1235
  • Репутация: 174
  • Пол: Мужской
  • Windows7 (x64)
    • Награды
  • Версия AutoIt: 3.3.12.0
...
Код: AutoIt [Выделить]
DllCall("User32.dll", "bool", "SetProcessDPIAware")

как раз и сообщает системе, что мы сами будем масштабировать?
Очень полезно к прочтению.

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3651
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Alofa  [?]
Цитировать
полезно к прочтению
Это только начало. Дальше - страшнее: PROCESS_DPI_AWARENESS.
Если что, аналогом вызова SetProcessDPIAware является установка PROCESS_SYSTEM_DPI_AWARE.

Кстати, в последних версиях полной SciTE есть директива Wrapper'а
Код: AutoIt [Выделить]
#AutoIt3Wrapper_Res_HiDpi=Y

которая при компиляции прописывает в манифест поддержку DPIAware (обычную, системную, не многомониторную).

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Ух, ты!! Молодцы, парни  :beer:

Русское сообщество AutoIt

Re: Создание GUI с учетом установленного масштабирования
« Ответ #6 Отправлен: Декабрь 09, 2017, 11:59:09 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2660 Просмотров
Последний ответ Ноябрь 21, 2010, 13:09:50
от maddoc
2 Ответов
1395 Просмотров
Последний ответ Сентябрь 15, 2012, 16:17:21
от ivsatel
10 Ответов
3306 Просмотров
Последний ответ Январь 26, 2014, 19:51:09
от ivsatel
7 Ответов
3359 Просмотров
Последний ответ Март 19, 2014, 20:58:08
от eus_deus
4 Ответов
1504 Просмотров
Последний ответ Август 10, 2014, 23:17:36
от forc1k
0 Ответов
679 Просмотров
Последний ответ Август 11, 2014, 07:03:53
от madmasles
2 Ответов
788 Просмотров
Последний ответ Март 15, 2015, 14:11:09
от Garrett
2 Ответов
1588 Просмотров
Последний ответ Август 30, 2015, 05:49:30
от madmasles
1 Ответов
1793 Просмотров
Последний ответ Октябрь 28, 2015, 08:51:02
от Yashied
6 Ответов
1536 Просмотров
Последний ответ Декабрь 29, 2016, 02:48:06
от Dessan