OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Масштабирование окон ББ
СообщениеДобавлено: Пятница, 28 Октябрь, 2016 18:10 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Как широко известно в узких кругах, в ББ есть недокументированная возможность масштабировать очередное открываемое окно:
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Пятница, 28 Октябрь, 2016 18:16 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Динамически поменять масштаб для уже открытого окна возможности нет, к этому логика фреймворка с ходу не готова.

Но для любого вьюва с моделью легко открыть новое окно (что и делает Window->New Window, F2).
Кому надо открывать документ с новым масштабом, очень легко совместить в какой-то команде выставление unit-а для нового окна и вызов StdCmds.NewWindow.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Пятница, 28 Октябрь, 2016 21:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Здорово, не знал, вещь нужная, буду посмотреть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 08:19 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
А эта весчь позволит массштабировать текст во встроенных текстовых вьюшках? Или как еще это можно реализовать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 12:28 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Может есть готовые примеры, где текст масштабируется? Пусть даже не в TextViews


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 13:02 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
По идее, масштабируется всё окно, всё его содержимое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 13:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
По идее, масштабируется всё окно, всё его содержимое.
Это in effect увеличение -- magnifier?
Примерчик не намекнёте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 13:53 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
У меня задача: по колесу мыши масштабировать свою графическую вьюшку-контейнер и встроенные в нее текстовые вьюшки. Своя прекрасно масштабируется через Restore, так же как и размер встроенных вьюшек, а вот текст в них остается прежнего размера. Открытие новых окон будет выглядеть как непрерывный процесс? F2 вроде как может открыть окно в новой позиции. Или может есть другие варианты, как решить задачу? Навскидку, менять размер шрифта у встроенных вьюшек, но может есть варианты, попроще?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 14:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Через обсуждаемый в этой ветке механизм не смасштабируете.
Этот коэффициент ставится один раз при открытии окна.

Пример - собственно, просто выставить HostWindows.dir.unit - перед любой командой открытия документа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 09:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Через обсуждаемый в этой ветке механизм не смасштабируете.
Этот коэффициент ставится один раз при открытии окна.

Пример - собственно, просто выставить 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 14:54 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
У меня тоже не работает. Это https://superuser.com/questions/66101/set-dpi-of-individual-applications-in-windows?noredirect=1&lq=1 может быть релевантно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 15:18 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Так заработало:
Код:
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). Насколько важны настройки масштабирования приложения - не понял, вроде они не влияют.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 15:31 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Цитата:
Это повлияет на любое очередное открываемое окно (его порт получит именно такой unit).

А как повлиять на окно справки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 15:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
budden писал(а):
Цитата:
Это повлияет на любое очередное открываемое окно (его порт получит именно такой unit).

А как повлиять на окно справки?

Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 16:26 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Пока следы ведут к такой инициализации в HostWindows
Код:
      unit := Ports.inch DIV WinApi.GetDeviceCaps(dc, WinApi.LOGPIXELSY);

Как поменять модуль Windows? Для этого надо слинковать новый BlackBoxComponentBuilder? А как?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 16:42 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Чтобы поменять масштаб всех окон, нужно после инициализации unit в модуле HostWindows поставить своё перемасштабирование, как-то так:
Код:
unit := Ports.inch DIV WinApi.GetDeviceCaps(dc, WinApi.LOGPIXELSY);
(* увеличим окно на 33% *)
unit := unit div 3 * 4;

Скомпилировать модуль HostWindows и сохранить его, затем перелинковать BBCB

Как линковать - написано в Справка/ искать "Standard BlackBox" с учётом регистра, или просто Linker. Там будет пример, надеюсь, он обновляется. Надо скопировать всю команду до пустой строки в новый документ, вместе с восклицательным знаком, заменить в ней имя исполняемого файла на BlackBox2 и выполнить эту команду, нажав на значок. Файл мгновенно появится рядом со старым.

Пока из замеченных глюков - только мелкий текст в окне поиска справки, впрочем, я особо ничего и не тестировал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 17:03 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
budden писал(а):
... затем перелинковать BBCB

Этот пункт не обязательный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 17:43 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Пока не работает мой вариант. Попробую твой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 17:47 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Иван Денисов писал(а):
Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения.

Так не пойдёт - тогда в дюйме перестанет быть 25.4 мм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Масштабирование окон ББ
СообщениеДобавлено: Суббота, 22 Сентябрь, 2018 17:54 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
budden писал(а):
Иван Денисов писал(а):
Все окна пляшут от Ports.inch так что можно эту константу поделить на два и все окна и тексты будут в два раза больше. Но модули Блэкбокса нужно перекомпилировать через Dev/Docu/Build-Tool.odc, чтобы он запустился после такого изменения.

Так не пойдёт - тогда в дюйме перестанет быть 25.4 мм.

Так и миллиметр поменяйте пропорционально. Он тоже там рядышком.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB