OberonCore https://forum.oberoncore.ru/ |
|
Масштабирование окон ББ https://forum.oberoncore.ru/viewtopic.php?f=24&t=5938 |
Страница 1 из 2 |
Автор: | Илья Ермаков [ Пятница, 28 Октябрь, 2016 18:10 ] |
Заголовок сообщения: | Масштабирование окон ББ |
Как широко известно в узких кругах, в ББ есть недокументированная возможность масштабировать очередное открываемое окно: Код: HostWindows.dir.unit := альтернативный размер пикселя в универсальных единицах Это повлияет на любое очередное открываемое окно (его порт получит именно такой unit). Единственный нюанс, что к этому не готовы стандартные контролы (HostCFrames). Там Винде отдаётся первый хэндл шрифта, а не хэндл с нужным unit-ом (HostFonts для любого шрифта (начертание-размер....) поддерживает список системных хэндлов на случай всех используемых unit-ов. Корректный код для подбора шрифта с нужным unit находится в HostPorts.DrawString. Соответственно, необходимая поправка - внесение в HostCFrames.Open правильного выбора шрифта: Код: PROCEDURE Open (f: StdCFrames.Frame; class, name: WinApi.PtrWSTR;
style, ex: SET; VAR i: Info); VAR res, x, y, w, h, cx, cy, cw, ch, udw: INTEGER; p: HostPorts.Port; s: SET; r: Ports.Rider; >>>df: HostFonts.DevFont;<<< BEGIN f.noRedraw := TRUE; r := f.rider; GetSize(f, x, y, w, h); r.GetRect(cx, cy, cw, ch); cw := cw - cx; ch := ch - cy; p := f.rider(HostPorts.Rider).port; IF p.wnd # 0 THEN (* port is a window *) i.bkgnd := BkGndColor(f); s := {27, 30}; (* disabled, child *) i.wnd := WinApi.CreateWindowExW({}, "Oberon Ctrl", "", s, cx, cy, cw, ch, p.wnd, 0, instance, 0); IF i.wnd # 0 THEN DEC(x, cx); DEC(y, cy); res := WinApi.SetWindowLongW(i.wnd, dlgWindowExtra, SYSTEM.VAL(INTEGER, f)); i.ctrl := WinApi.CreateWindowExW(ex, class, name, style, x, y, w, h, i.wnd, 0, instance, 0); IF i.ctrl # 0 THEN IF (SubclassCtl # NIL) & ~(f IS PushButton) THEN SubclassCtl(i.ctrl) END; IF f.font # NIL THEN >>df := f.font(HostFonts.Font).dev; >>WHILE (df # NIL) & (df.unit # f.unit) DO df := df.next END; >>IF df = NIL THEN >> HostFonts.InsertDevFont(p.dc, f.font(HostFonts.Font), df, p.unit) >>END; res := WinApi.SendMessageW(i.ctrl, WinApi.WM_SETFONT, df.id, 0) END; ....................................... END Open; |
Автор: | Илья Ермаков [ Пятница, 28 Октябрь, 2016 18:16 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Динамически поменять масштаб для уже открытого окна возможности нет, к этому логика фреймворка с ходу не готова. Но для любого вьюва с моделью легко открыть новое окно (что и делает Window->New Window, F2). Кому надо открывать документ с новым масштабом, очень легко совместить в какой-то команде выставление unit-а для нового окна и вызов StdCmds.NewWindow. |
Автор: | Info21 [ Пятница, 28 Октябрь, 2016 21:29 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Здорово, не знал, вещь нужная, буду посмотреть. |
Автор: | adva [ Понедельник, 02 Октябрь, 2017 08:19 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
А эта весчь позволит массштабировать текст во встроенных текстовых вьюшках? Или как еще это можно реализовать? |
Автор: | adva [ Понедельник, 02 Октябрь, 2017 12:28 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Может есть готовые примеры, где текст масштабируется? Пусть даже не в TextViews |
Автор: | Илья Ермаков [ Понедельник, 02 Октябрь, 2017 13:02 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
По идее, масштабируется всё окно, всё его содержимое. |
Автор: | Info21 [ Понедельник, 02 Октябрь, 2017 13:47 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Илья Ермаков писал(а): По идее, масштабируется всё окно, всё его содержимое. Это in effect увеличение -- magnifier?Примерчик не намекнёте? |
Автор: | adva [ Понедельник, 02 Октябрь, 2017 13:53 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
У меня задача: по колесу мыши масштабировать свою графическую вьюшку-контейнер и встроенные в нее текстовые вьюшки. Своя прекрасно масштабируется через Restore, так же как и размер встроенных вьюшек, а вот текст в них остается прежнего размера. Открытие новых окон будет выглядеть как непрерывный процесс? F2 вроде как может открыть окно в новой позиции. Или может есть другие варианты, как решить задачу? Навскидку, менять размер шрифта у встроенных вьюшек, но может есть варианты, попроще? |
Автор: | Илья Ермаков [ Понедельник, 02 Октябрь, 2017 14:27 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Через обсуждаемый в этой ветке механизм не смасштабируете. Этот коэффициент ставится один раз при открытии окна. Пример - собственно, просто выставить HostWindows.dir.unit - перед любой командой открытия документа. |
Автор: | Info21 [ Суббота, 22 Сентябрь, 2018 09:27 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Илья Ермаков писал(а): Через обсуждаемый в этой ветке механизм не смасштабируете. Пардон, пропустил совет.Этот коэффициент ставится один раз при открытии окна. Пример - собственно, просто выставить HostWindows.dir.unit - перед любой командой открытия документа. Однако не получается: оба окна открываются в одном старом масштабе: MODULE x; IMPORT HostWindows, StdCmds; PROCEDURE x*; BEGIN StdCmds.NewWindow; HostWindows.dir.unit := HostWindows.dir.unit * 10; StdCmds.NewWindow; HostWindows.dir.unit := HostWindows.dir.unit DIV 10; END x; END (!)x.x |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 14:54 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
У меня тоже не работает. Это https://superuser.com/questions/66101/set-dpi-of-individual-applications-in-windows?noredirect=1&lq=1 может быть релевантно. |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 15:18 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Так заработало: Код: MODULE x; IMPORT HostWindows, StdCmds, Out; PROCEDURE x*; BEGIN (* Выведется 0 *) Out.Int(HostWindows.dir.unit,20);Out.Ln; HostWindows.dir.unit := 4000; StdCmds.NewWindow; END x; END x. (* Здесь вставлен коммандер x.x *) (Windows 10). Насколько важны настройки масштабирования приложения - не понял, вроде они не влияют. |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 15:31 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Цитата: Это повлияет на любое очередное открываемое окно (его порт получит именно такой unit). А как повлиять на окно справки? |
Автор: | Иван Денисов [ Суббота, 22 Сентябрь, 2018 15:53 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
budden писал(а): Цитата: Это повлияет на любое очередное открываемое окно (его порт получит именно такой unit). А как повлиять на окно справки? Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения. |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 16:26 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Пока следы ведут к такой инициализации в HostWindows Код: unit := Ports.inch DIV WinApi.GetDeviceCaps(dc, WinApi.LOGPIXELSY); Как поменять модуль Windows? Для этого надо слинковать новый BlackBoxComponentBuilder? А как? |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 16:42 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Чтобы поменять масштаб всех окон, нужно после инициализации unit в модуле HostWindows поставить своё перемасштабирование, как-то так: Код: unit := Ports.inch DIV WinApi.GetDeviceCaps(dc, WinApi.LOGPIXELSY); (* увеличим окно на 33% *) unit := unit div 3 * 4; Скомпилировать модуль HostWindows и сохранить его, затем перелинковать BBCB Как линковать - написано в Справка/ искать "Standard BlackBox" с учётом регистра, или просто Linker. Там будет пример, надеюсь, он обновляется. Надо скопировать всю команду до пустой строки в новый документ, вместе с восклицательным знаком, заменить в ней имя исполняемого файла на BlackBox2 и выполнить эту команду, нажав на значок. Файл мгновенно появится рядом со старым. Пока из замеченных глюков - только мелкий текст в окне поиска справки, впрочем, я особо ничего и не тестировал. |
Автор: | Иван Денисов [ Суббота, 22 Сентябрь, 2018 17:03 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
budden писал(а): ... затем перелинковать BBCB Этот пункт не обязательный. |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 17:43 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Пока не работает мой вариант. Попробую твой. |
Автор: | budden [ Суббота, 22 Сентябрь, 2018 17:47 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
Иван Денисов писал(а): Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения. Так не пойдёт - тогда в дюйме перестанет быть 25.4 мм. |
Автор: | Иван Денисов [ Суббота, 22 Сентябрь, 2018 17:54 ] |
Заголовок сообщения: | Re: Масштабирование окон ББ |
budden писал(а): Иван Денисов писал(а): Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения. Так не пойдёт - тогда в дюйме перестанет быть 25.4 мм. Так и миллиметр поменяйте пропорционально. Он тоже там рядышком. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |