Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Может, есть какой-нибудь софт, помогающий двигать элементы и менять их размер в активном/отображенном диалоге, с последующим пересчетом позиций/размеров в DLU?
А это кого-то, кроме тебя, беспокоит?
Re[7]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В чем разбираться? Для описанной задачи достаточно как-то указать требуемый элемент, и вызывать для него SetWindowPos. Даже в процесс встраиваться не нужно.
Ну и сделай
Re[2]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В винде, как известно, есть проблема масштабирования диалогов... ЕМ>...в активном/отображенном диалоге, с последующим пересчетом позиций/размеров в DLU?
Вы всё ещё про диалоги. Неужиле для С++ ничего лучше MFC не придумали?
------------
Я бы не стал относить вопрос из сабжа к Win32 — это вопрос про MFC.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Если статические, попробуйте, например, Static Text слева от Edit/Combo Box, чтоб при масштабе 100% текст отображался полностью, и заканчивался где-то в 6-7 точках от следующего элемента. При масштабе 125% такой текст обрезается и в Win7, и в Win8, и в Win10/11, независимо от наличия/отсутствия манифестов поддержки DPI. Если увеличивать интервал до 8-10 точек, то в масштабе 100% образуется слишком широкий зазор.
ЕМ>Я так понимаю, это все от кривого пересчета DLU в точки.
В DLU задается размер элемента, а GDI рендерит текст по размеру в логических пикселях.
Т.е. не "вписывает" каждую буковку в DLU-шную сетку диалога.
Из-за растризации каждой буквы и связанного с ней округления накапливается разница в длине.
Растризация выполняется в физические пиксели монитора, а не в логические.
Например, линия в 1 логический пиксель при масштабе 200% растризуется в 2 физических пикселя, а при 125% — в один.
Эта проблема GDI особенно сильно вылазила для печати и предварительного просмотра, где масштаб меняется в широких пределах, а также DPI принтера может быть очень разным.
И второй эффект, который может влиять даже сильнее округления при растризации.
Размер шрифта диалога задается в поинтах, которые также привязаны к логическим пикселям в условиях фиксированного DPI.
В структуре LOGFONT за размер отвечает поле lfHeight, где как раз логические пиксели.
И тут просто не хватает точности указания этой высоты. Например, -10 и -12 (в норме она отрицательная).
Если бы они использовали логические пиксели умноженные на 10 хотя бы, то можно было бы задавать -105, например.
Допустим шрифт у нас с высотой -10 на 100%, на 125% он будет -12, а не -12.5 (а это уже 4% разницы).
Программы для тестирования размеров элементов диалога
В винде, как известно, есть проблема масштабирования диалогов: когда система растягивает диалог для отображения в масштабе больше 100%, размеры элементов приходится округлять, из-за чего они нередко отображаются неправильно (чаще всего пропадают последние буквы static text).
Подбирать размеры/расстояния, изменяя их в редакторе, собирая приложение, и запуская его в сеансе с масштабированием, долго и муторно, а включать масштабирование в рабочем сеансе — стремно.
Может, есть какой-нибудь софт, помогающий двигать элементы и менять их размер в активном/отображенном диалоге, с последующим пересчетом позиций/размеров в DLU?
Re: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В винде, как известно, есть проблема масштабирования диалогов: когда система растягивает диалог для отображения в масштабе больше 100%, размеры элементов приходится округлять, из-за чего они нередко отображаются неправильно (чаще всего пропадают последние буквы static text).
ЕМ>Подбирать размеры/расстояния, изменяя их в редакторе, собирая приложение, и запуская его в сеансе с масштабированием, долго и муторно, а включать масштабирование в рабочем сеансе — стремно.
ЕМ>Может, есть какой-нибудь софт, помогающий двигать элементы и менять их размер в активном/отображенном диалоге, с последующим пересчетом позиций/размеров в DLU?
Тебе не понравиться — WebView
Re[2]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
_>>Тебе не понравиться — WebView
ЕМ>А куда там лошадь запрягать WinAPI прикручивать?
Как куда прямо на диалог кладёте ActiveX и алга
Но это будет устаревшее говно Trident. Хотя мои приложения, которым по 20 лет, до сих пор прекрасно работают, но писать новое я б на нём не стал.
Есть WebView2, на Хромиуме, но под 11-ую. Есть CEF. И есть Sciter. Бизнес-логику, и ту часть WinAPI, которое не про UI, можно вызывать из скриптовых обработчиков событий.
Но сначала один вопрос ТСу. Как у него так получается, что пропадают последние буквы static text, если localizable UI предполагает немецкий язык и очень большой запас длины? На немецком пропадают? Так им и надо, фашистам. Но если пропадает на других языках, надо просто запас сделать побольше. Сейчас уже трудно найти винапишную программу в виндах, но я взял регедит и сфоткал диалог оттуда с PE (это та же функция, что в Spy), вот какой запас по ширине:
Но и то, это плохо сделано. Надо было на всю ширину диалога. К чему эта странная экономия?
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[4]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Мне бы хотелось именно того, что я изначально описал. Это ж не только для своего — есть и другие приложения, которые портятся при масштабировании.
ЕМ>Есть такое, или никто не сподобился?
А всем лень разбираться. Там же и масштабирование экранов и dpi видео драйвера и размеры шрифтов плюс костыли для совместимости и ещё сверху бантик с манифестами.
И всё это вместо банальной фунции получения физических размеров в мм
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Мне бы хотелось именно того, что я изначально описал. Это ж не только для своего — есть и другие приложения, которые портятся при масштабировании. ЕМ>Есть такое, или никто не сподобился?
AFAIK для воспроизведения большинства Win API (GDI) проблем с HiDPI нужен реальный 4к+ монитор к сожалению, без него их не воспроизвести. Если нет — идти в магазин на амазон и покупать.
С ним они элементарно воспроизводятся просто установкой масштаба. Студия умеет переключаться (devenv /noscale). С "обычным" монитором эти проблемы не воспроизводятся, какой бы ты масштаб ни ставил.
Насколько я понял, поскольку проблемы зарыты в системе, пользовательского софта для их эмуляции AFAIK нет (я искал)
ActiveX (Web Browser Control) устарел на 20 лет, там IE11 максимум (да и тот с приседаниями), на котором уже ничего практически не работает.
Это не учитывая проблемы которые всегда были (типа ActiveX security warning)
CEF тебе скорее всего не понравится (50мб на ровном месте за здорово живешь)
Sciter (здесь) в принципе норм, я на нем делал UI, небольшой и достаточно удобный для плюсов,
минус тот, что почти все современные готовые javasript web-ui библиотеки на нем не работают (даже jQuery) Андрей упирался рогом годами со своим tiscript, ну вот и результат. Невозможно объять необъятное.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В винде, как известно, есть проблема масштабирования диалогов: когда система растягивает диалог для отображения в масштабе больше 100%, размеры элементов приходится округлять, из-за чего они нередко отображаются неправильно (чаще всего пропадают последние буквы static text).
Эх, Win32 и его "поддержка" High DPI. Мало того, что надо все ручками делать, например, если рисовать GDI линию в один пиксел, то на масштабе до 150 рисуем в один пиксел, от 150 до 249 — в два и тд., самому изменить размеры окон, выбирать нужный набор графики (если растровая) под каждый масштаб, так еще диалоги живут своей жизнью, так как там не пикселы, а dialog units или как их там
Там как раз есть изменение размера контролов при изменении текста в них.
What is XUILIB?
XUILIB is the open source XML User Interface Library. XUILIB allow you to define the dialog boxes using the XML files. XUILIB XML files syntax is very similar to html. Generally you don't need to define the element's sizes, XUILIB have the build-in layout manager, so all elemnts will be at right positions, even the text labels are changed.
Main Features
All controls are the native Windows controls so there no problems with the XP/Vista themes
Automatically calculated layout
Support standards for control sizes and spaces between controls
External localization files in the XML format
Open Source
Re[6]: Программы для тестирования размеров элементов диалога
Здравствуйте, kov_serg, Вы писали:
_>всем лень разбираться.
В чем разбираться? Для описанной задачи достаточно как-то указать требуемый элемент, и вызывать для него SetWindowPos. Даже в процесс встраиваться не нужно.
Re[6]: Программы для тестирования размеров элементов диалога
Здравствуйте, bnk, Вы писали:
bnk>AFAIK для воспроизведения большинства Win API (GDI) проблем с HiDPI нужен реальный 4к+ монитор к сожалению, без него их не воспроизвести.
Чем реальный монитор отличается от виртуального экрана VM? Монитор-то никак не обрабатывает изображение.
bnk>С ним они элементарно воспроизводятся просто установкой масштаба.
Те проблемы, о которых я писал, элементарно воспроизводятся на любом экране, хоть реальном, хоть виртуальном, установкой масштаба 125%.
Про библиотеки я в курсе, но мне пока нужно всего лишь подобрать размеры/положения элементов, чтоб не сильно съезжали при типовом масшабировании.
Re[2]: Программы для тестирования размеров элементов диалога
Здравствуйте, TheBeginner, Вы писали:
TB>если рисовать GDI линию в один пиксел, то на масштабе до 150 рисуем в один пиксел, от 150 до 249 — в два и тд.
Не понял. Что значит "линию в один пиксел" — указывать единичную ширину в функциях рисования, или чтоб она занимала один пиксел на экране?
, самому изменить размеры окон, выбирать нужный набор графики (если растровая) под каждый масштаб, так еще диалоги живут своей жизнью, так как там не пикселы, а dialog units или как их там
TB>Посмотрите на XUILIB от нашего форумчанина:
Спасибо, погляжу.
Re[7]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
bnk>>AFAIK для воспроизведения большинства Win API (GDI) проблем с HiDPI нужен реальный 4к+ монитор к сожалению, без него их не воспроизвести.
ЕМ>Чем реальный монитор отличается от виртуального экрана VM? Монитор-то никак не обрабатывает изображение.
bnk>>С ним они элементарно воспроизводятся просто установкой масштаба.
ЕМ>Те проблемы, о которых я писал, элементарно воспроизводятся на любом экране, хоть реальном, хоть виртуальном, установкой масштаба 125%.
У меня не воспроизводились, поэтому и говорю. Возможно специфика приложения
ЕМ>Про библиотеки я в курсе, но мне пока нужно всего лишь подобрать размеры/положения элементов, чтоб не сильно съезжали при типовом масшабировании.
Здравствуйте, bnk, Вы писали:
bnk>AFAIK для воспроизведения большинства Win API (GDI) проблем с HiDPI нужен реальный 4к+ монитор к сожалению, без него их не воспроизвести...
У тебя видюха какая? Не пробовал виртуальные разрешения (забыл как правильно называются) от NVIDIA?
Я, кстати, гуй делал, но у меня никогда не было 4к монитора — даже не видел особой необходимости. И когда сдавал монитор с прошлой работы, крепко задумался о параметрах монитора для покупки на замену. По итогу не стал покупать 4к.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[7]: Программы для тестирования размеров элементов диалога
Здравствуйте, Философ, Вы писали:
bnk>>AFAIK для воспроизведения большинства Win API (GDI) проблем с HiDPI нужен реальный 4к+ монитор к сожалению, без него их не воспроизвести...
Ф>У тебя видюха какая? Не пробовал виртуальные разрешения (забыл как правильно называются) от NVIDIA?
Сейчас встройка AMD (Radeon 780). Но не думаю что есть разница.
Когда подключаешь монитор 4к, разница в том как редтерится WinAPI была видна просто невооруженным глазом. Я не знаю почему.
Ф>Я, кстати, гуй делал, но у меня никогда не было 4к монитора — даже не видел особой необходимости. И когда сдавал монитор с прошлой работы, крепко задумался о параметрах монитора для покупки на замену. По итогу не стал покупать 4к.
У меня тоже сейчас "обычное" (49" 5K), HiDPI 4K я уже продал
Потому тема и интересна, как эти проблемы воспроизвести.
Изменением масштаба у меня обрезание НЕ воспроизводится, все нормально масшатбируется.
Re[8]: Программы для тестирования размеров элементов диалога
Здравствуйте, bnk, Вы писали:
bnk>Когда подключаешь монитор 4к, разница в том как редтерится WinAPI была видна просто невооруженным глазом. Я не знаю почему.
Разница по сравнению чего с чем? Я про виртуальные разрешения спрашивал. Если такая фича есть в АМДшных дравах, ты пробовал это?
bnk>У меня тоже сейчас "обычное" (49" 5K), HiDPI 4K я уже продал
Зачем? оно стоит того?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[9]: Программы для тестирования размеров элементов диалога
Здравствуйте, Философ, Вы писали:
bnk>>Когда подключаешь монитор 4к, разница в том как редтерится WinAPI была видна просто невооруженным глазом. Я не знаю почему.
Ф>Разница по сравнению чего с чем? Я про виртуальные разрешения спрашивал. Если такая фича есть в АМДшных дравах, ты пробовал это?
Да. Никакой разницы, просто скорл десктопа.
bnk>>У меня тоже сейчас "обычное" (49" 5K), HiDPI 4K я уже продал
Ф>Зачем? оно стоит того?
Вместо двух мониторов и стоек — один. Еще удобно делать 3-way-merge.
Re[2]: Программы для тестирования размеров элементов диалога
Здравствуйте, пффф, Вы писали:
П>А это кого-то, кроме тебя, беспокоит?
Теоретически эта проблема должна волновать динозавров, которые по какой-то загадочной причине не вымерли, и продолжают писать на MFC. Динозавры при этом должны ещё и о hiDPI парится, т.е. писать для достаточно большой аудитории.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[8]: Программы для тестирования размеров элементов диалога
Здравствуйте, bnk, Вы писали:
bnk>У меня не воспроизводились, поэтому и говорю. Возможно специфика приложения
У Вас диалоги статические (загружаемые непосредственно из ресурсов) или динамические (создаваемые/настраиваемые в процессе выполнения)?
Если статические, попробуйте, например, Static Text слева от Edit/Combo Box, чтоб при масштабе 100% текст отображался полностью, и заканчивался где-то в 6-7 точках от следующего элемента. При масштабе 125% такой текст обрезается и в Win7, и в Win8, и в Win10/11, независимо от наличия/отсутствия манифестов поддержки DPI. Если увеличивать интервал до 8-10 точек, то в масштабе 100% образуется слишком широкий зазор.
bnk>просто в манифест прописать что надо
Дык, прописано, не помогает. Пока не было прописано — масштабировало с замыливанием. После прописывания замыливание пропало, но тексты все равно обрезаются. Я так понимаю, это все от кривого пересчета DLU в точки.
Re[3]: Программы для тестирования размеров элементов диалога
Здравствуйте, Философ, Вы писали:
Ф>Причём тут Win32
При том, что этим занимается Win32.
Ф>и зачем всё делать руками?
Например, чтоб не тащить в проект библиотеки "на все случаи жизни" (особенно с "экосистемой", вроде Qt), когда требуется всего-то умеренная адаптация к механизмам, реализованным в ОС.
Ф>Неуж-то Win32 ограничивается GDI?
Окна и диалоги — это уже не чистый GDI, а надстройка над ним.
Что в Win32 есть адекватного для решения описанных проблем?
Re[2]: Программы для тестирования размеров элементов диалога
ЕМ>В чем разбираться? Для описанной задачи достаточно как-то указать требуемый элемент, и вызывать для него SetWindowPos. Даже в процесс встраиваться не нужно.
А вам надо для своего процесса или для чужого?
Re[8]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В винде, как известно, есть проблема масштабирования диалогов: когда система растягивает диалог для отображения в масштабе больше 100%, размеры элементов приходится округлять, из-за чего они нередко отображаются неправильно (чаще всего пропадают последние буквы static text).
В нормальных графических системах (HTML, Gtk, Tk, Qt...) координаты не гвоздями
прибиваются, а есть так называемая "упаковка", когда есть набор правил описывающих
как будут рстягиваться и позиционироваться элементы. При этом размеры самих элементов
вычисляются динамически, размеры шрифтов заранее не известны и т.п. Обычно всё
выравнивается ну примерно как текст в редакторе wordpad: по какому-либо краю, с
растяжкой или нет... И проблем с тем, что что-то куда-то наезжает -- нет.
Re[9]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
Ф>>Неужиле для С++ ничего лучше MFC не придумали? ЕМ>А вот про MFC я ничего не говорил.
А что ещё это может быть, если уж речь про диалоги!? Кроме как в контексте MFC я нигде их больше не встречал.
ЕМ>А я бы не стал этого утверждать, толком не понимая, что такое MFC.
Я понимаю что это: кривая минималистичная надстройка над Win32API. Это единственное место, где я видел диалоги. Я бы сказал, что эта часть API оставлена для обратной совместимости — чтоб старый софт работал. Давно уже это пора пометить как obsolete, а лучше deprecated — чтоб варнинги вываливало.
UPD:
Many Windows APIs do not have an DPI context
Many legacy Windows APIs do not include a DPI or HWND context as part of their interface. As a result, developers often have to do additional work to handle the scaling of any DPI-sensitive information, such as sizes, points, or icons. As an example, developers using LoadIcon must either bitmap stretch loaded icons or use alternate APIs to load correctly-sized icons for the appropriate DPI, such as LoadImage.
Вот эти самые API я бы и назвал legacy. Более того, если рисовать с помощью direct2d или direct3d, то DPI будет учитываться автоматически. Например, в WPF с этим вообще проблем нет — оно не пиксели использует.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Евгений Музыченко, Вы писали:
bnk>>У меня не воспроизводились, поэтому и говорю. Возможно специфика приложения
ЕМ>У Вас диалоги статические (загружаемые непосредственно из ресурсов) или динамические (создаваемые/настраиваемые в процессе выполнения)?
WinForms (.NET)
ЕМ>Если статические, попробуйте, например, Static Text слева от Edit/Combo Box, чтоб при масштабе 100% текст отображался полностью, и заканчивался где-то в 6-7 точках от следующего элемента. При масштабе 125% такой текст обрезается и в Win7, и в Win8, и в Win10/11, независимо от наличия/отсутствия манифестов поддержки DPI. Если увеличивать интервал до 8-10 точек, то в масштабе 100% образуется слишком широкий зазор.
Поставь метки НАД контролами и не парься. Я перевел когда делал локализацию на немецкий. Все равно там нифига не входит.
125% — смешно. На Microsoft Surface 200% стотит чуть ли не по умолчанию.
bnk>>просто в манифест прописать что надо
ЕМ>Дык, прописано, не помогает. Пока не было прописано — масштабировало с замыливанием. После прописывания замыливание пропало, но тексты все равно обрезаются. Я так понимаю, это все от кривого пересчета DLU в точки.
Там размер шрифта диалога еще нужно выставить. DLU от него считается. Я бросил всю эту возню, переделал на Web UI.
Здравствуйте, Философ, Вы писали:
bnk>>Там размер шрифта диалога еще нужно выставить. DLU от него считается. Я бросил всю эту возню, переделал на Web UI.
Ф>Если изначально был .NET (его можно было), то почему Web UI, а не WPF?
Изначально был старый софт (больше 15 лет). Web UI в основном потому что WPF нормально готовить не умею.
Здравствуйте, fk0, Вы писали:
fk0>В нормальных графических системах (HTML, Gtk, Tk, Qt...) координаты не гвоздями прибиваются, а есть так называемая "упаковка"
Я в курсе, и давно хочу себе такое, но ни разу не видел в изолированном варианте, чтоб только указать, каким образом выравнивать элементы — оно почему-то всегда идет вместе с обширным набором средств чуть не на все случаи жизни, или в виде фреймворка, или завязано на другие библиотеки.
Когда-то я делал небольшую софтину для расстановки дочерних окон в MDI-приложениях по схожим принципам, то ли ее перепилить под это дело...
Re[10]: Программы для тестирования размеров элементов диалога
Здравствуйте, kov_serg, Вы писали:
_>Тогда копайте отсюда
А как мне это поможет в изначально озвученной цели? Как рисовать DPI-aware окна, я примерно представляю, но пока-то задача тупо адаптировать существующие простые диалоги к системному масштабированию.
Re[13]: Программы для тестирования размеров элементов диалог
Здравствуйте, Философ, Вы писали:
bnk>>Изначально был старый софт (больше 15 лет). Web UI в основном потому что WPF нормально готовить не умею.
Ф>[cut=сможешь название программы прочитать?]
Не, не могу, оно замыленное. Это Скайп?
Ф>Меня уже слегка достали люди, которые думают, что всё просто и тут всё сделать элементарно — натыкал и работает.
Ну так так оно и есть — сказал GPT сделай мне красивую страничку, он сделал
Re[4]: Программы для тестирования размеров элементов диалога
Здравствуйте, bnk, Вы писали:
bnk>125% — смешно. На Microsoft Surface 200% стотит чуть ли не по умолчанию.
Так погрешности ж не увеличиваются с ростом масштаба. Если оставлять достаточные промежутки, на любом масштабе искажений нет. Задача — подобрать величину промежутков.
bnk>Там размер шрифта диалога еще нужно выставить. DLU от него считается.
Угу, у меня они стандартные везде.
Re[11]: Программы для тестирования размеров элементов диалога
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Так погрешности ж не увеличиваются с ростом масштаба. Если оставлять достаточные промежутки, на любом масштабе искажений нет. Задача — подобрать величину промежутков.
Я имел в виду вот
Re[12]: Программы для тестирования размеров элементов диалога