Odpověď

Jméno:
E-mail:
Předmět:
Ikona zprávy:

Ověření:
Křestní jméno zpěváka Gotta:

Zkratky: stiskněte shift+alt+s pro odeslání nebo shift+alt+p pro prohlédnutí


Shrnutí tématu

Poslal: Ondřej Pokorný
« kdy: 17-01-2018, 14:11:08 »

Právě že ne. Retina má tu virtuální matici. Takže OSX vrací vždycky 96 DPI = 100%. Pro zjištění retina faktoru musíš použít:
To by šlo, vyskúšam, samozrejme musím riešiť cez ten scaleFactor lebo tiež MacOS má rôzne stupne asi. Otázka je či by sa to nedalo nejak do LCL zapracovať aby sa nemuselo pri tvorbe komponentov priamo pristupovať k platforme (NS*).

Jo, bude se to řešit.
Poslal: ps
« kdy: 17-01-2018, 12:23:57 »

Právě že ne. Retina má tu virtuální matici. Takže OSX vrací vždycky 96 DPI = 100%. Pro zjištění retina faktoru musíš použít:
To by šlo, vyskúšam, samozrejme musím riešiť cez ten scaleFactor lebo tiež MacOS má rôzne stupne asi. Otázka je či by sa to nedalo nejak do LCL zapracovať aby sa nemuselo pri tvorbe komponentov priamo pristupovať k platforme (NS*).
Poslal: Ondřej Pokorný
« kdy: 15-01-2018, 07:52:37 »

Hmm tak to by takto šlo, teda keby ten stretchdraw fungoval.

Sám si to vyzkouším až se vrátím domů (v únoru), ale od kluků z ScooterSoftware mám echo, že oni právě pro retinu používají StretchDraw.

Citace
Glyph používam len ako storage (TBitmap), kreslím to samostatne. Nemám teraz mac k dispozícii, keď budem mať vyskúšam. A ScaleDesignToForm(32) mi vráti 64 na Retine?

Právě že ne. Retina má tu virtuální matici. Takže OSX vrací vždycky 96 DPI = 100%. Pro zjištění retina faktoru musíš použít:

Kód: [Vybrat]
function UiIsRetina: Boolean;
begin
if CurrentOS = osMacOSX106 then
    Result := (BcNSScreen(NSScreen.mainScreen).userSpaceScaleFactor > 1.0)
else
    Result := (BcNSScreen(NSScreen.mainScreen).backingScaleFactor > 1.0)
end;

function TBcCarbonForm.GetIsRetina: Boolean;
var    Window: BcNSWindow;
begin
Window := BcNSWindow(GetWindowRefAsNSWindow);
if CurrentOS = osMacOSX106 then
    Result := (Window.userSpaceScaleFactor > 1.0)
else
    Result := (Window.backingScaleFactor > 1.0)
end;

Citace
A cez Canvas.Line bude mať výšku povedzme 2 px namiesto 1px a nemám šancu inak ako cez bitmap nakresliť 1px čiaru? (Teda ak som to správne pochopil teraz).

Jo, tak nějak by to mělo být.
Poslal: ps
« kdy: 15-01-2018, 07:43:37 »

Hmm tak to by takto šlo, teda keby ten stretchdraw fungoval. Glyph používam len ako storage (TBitmap), kreslím to samostatne. Nemám teraz mac k dispozícii, keď budem mať vyskúšam. A ScaleDesignToForm(32) mi vráti 64 na Retine? A cez Canvas.Line bude mať výšku povedzme 2 px namiesto 1px a nemám šancu inak ako cez bitmap nakresliť 1px čiaru? (Teda ak som to správne pochopil teraz).
Poslal: Ondřej Pokorný
« kdy: 15-01-2018, 07:31:40 »

Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Aby sa to správalo rovnako ako na inej platforme (Win) teda 32x32 kreslilo na 32x32, alebo aby sa to scalovalo aj na Win (asi horšia varianta) a na správne kreslenie by sa použila iná funkcia.

Mezi OSX a WIN je jeden zásadní rozdíl: a to ten, že Apple má virtuální rozlišení. T.j. 32x32 se kreslí na 32x32 a je to rozmazané. Jestli to nechceš mít rozmazané, musíš kreslit 64x64 na 32x32. S tím se nedá nic dělat.

TImageList to bude umět ošetřit (pokud rozezná retinu, vezme prostě vyšší rozlišení a nakreslí ho napolovic). Pokud používáš TSpeedButton.Glyph, máš smůlu. To se prostě vyřešit pořádně nedá. Kvůli tomu přidám právě do TSpeedButton a TBitBtn podporu image listu.
Poslal: ps
« kdy: 15-01-2018, 07:15:52 »

Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Aby sa to správalo rovnako ako na inej platforme (Win) teda 32x32 kreslilo na 32x32, alebo aby sa to scalovalo aj na Win (asi horšia varianta) a na správne kreslenie by sa použila iná funkcia.
Poslal: ps
« kdy: 15-01-2018, 07:11:43 »

Viz http://wiki.lazarus.freepascal.org/High_DPI, "High DPI in Lazarus 1.8 and above" -> zavolá se AutoAdjustLayout/DoAutoAdjustLayout.
Vďaka, už som si hovoril, že po večeroch to nebudem riešiť. Asi na to nevidím poriadne 100x som to čítal :)
Poslal: Ondřej Pokorný
« kdy: 15-01-2018, 05:15:04 »

Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

Viz http://wiki.lazarus.freepascal.org/High_DPI, "High DPI in Lazarus 1.8 and above" -> zavolá se AutoAdjustLayout/DoAutoAdjustLayout.
Poslal: Ondřej Pokorný
« kdy: 15-01-2018, 01:49:19 »

+ Dmitry začal pracovat na Cocoa interface (Sphere 10 Software to podpřilo Bounty) - u nás to jede :) Jen škoda, že ta Lazarus foundation nějak nenaplnila očekávání...

Videl som ,že robí Cocoa pekným tempom. Dúfam, že aj tieto ikony vyrieši, a asi spolu s nimi aj tento zásadný bug: https://bugs.freepascal.org/view.php?id=32816 , https://forum.lazarus.freepascal.org/index.php?topic=33215.0

Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Poslal: Delfin
« kdy: 14-01-2018, 21:48:10 »

Od Windows 10 muzes odchytit pro vizualni komponenty s handle zpravu WM_DPICHANGED_BEFOREPARENT. K tomu je treba per monitor DPI awareness v2.
Poslal: Delfin
« kdy: 14-01-2018, 21:15:04 »

Super. Osobne imagelist nepoužívam, ale pozriem sa na implementáciu (používam font awesome). Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

Zprava kterou na Windows platforme potrebujes odchytit je WM_DPICHANGED, ale je urcena oknu (formulari), ne potomkum (vizualnim komponentam), natoz pak potomku ktery nema handle. K tomu je jeste treba per monitor DPI awareness povolit.
Poslal: ps
« kdy: 14-01-2018, 21:05:37 »

Poslední tři dny jsem pracoval na posledním dílu High-DPI skládačky - TImageListu.
Super. Osobne imagelist nepoužívam, ale pozriem sa na implementáciu (používam font awesome). Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

+ Dmitry začal pracovat na Cocoa interface (Sphere 10 Software to podpřilo Bounty) - u nás to jede :) Jen škoda, že ta Lazarus foundation nějak nenaplnila očekávání...

Videl som ,že robí Cocoa pekným tempom. Dúfam, že aj tieto ikony vyrieši, a asi spolu s nimi aj tento zásadný bug: https://bugs.freepascal.org/view.php?id=32816 , https://forum.lazarus.freepascal.org/index.php?topic=33215.0

Foundation nejak asi umrela, mohlo to byť celkom fajn. Dať tam nejaké mesačné platby ako má blender foundation a mohlo sa z toho zaplatiť pár programátorov ...
Poslal: Ondřej Pokorný
« kdy: 12-01-2018, 05:08:42 »

Kéž tohle fungovalo i v Delphi...
Třeba si někdo u Embarcadera taky udělá tři dny čas a zapracuje na tom.

Citace
Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...

Jak psal Delphin - jedině synchronizovat více TImageListů a při změně rozlišení je přehazovat, popř. generovat nová rozlišení (a zvětšovat/zmenšovat komponenty) - což je vopruz :/ Lazarus/LCL se ti postará o všechno.
Poslal: Delfin
« kdy: 11-01-2018, 18:07:30 »

Kéž tohle fungovalo i v Delphi... Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...

Pomoci udalosti OnBeforeMonitorDpiChanged a OnAfterMonitorDpiChanged vyvolanych pri zmene DPI formu (vcetne presunu na monitor s jinym DPI)? Image listu muzes mit vic, nebo je tvorit a plnit z resources za behu (zbytek je o volbe nejblizsi vhodne velikosti).
Poslal: vandrovnik
« kdy: 11-01-2018, 16:55:29 »

Kéž tohle fungovalo i v Delphi... Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...