OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 20 Октябрь, 2017 06:26

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




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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

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


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

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