Как широко известно в узких кругах, в ББ есть недокументированная возможность масштабировать очередное открываемое окно:
Код:
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;